非基础案例如何递归工作?

问题描述 投票:0回答:2

我想完全理解递归。我了解返回1之前必须满足基本情况(n = 0)的部分,我完全理解该部分。当它满足基本情况条件时,它返回到调用它的实例,即n = 1,我也理解。

现在它如何递增并回到n = 2,其背后的机制如何使其回到n = 5?我想我这里缺少什么。

<?php

function factorial( $n ) {

  // Base case
  if ( $n == 0 ) {
    echo "Base case: $n = 0. Returning 1...<br>";
    return 1;
  }

  // Recursion
  echo "$n = $n: Computing $n * factorial( " . ($n-1) . " )...<br>";
  $result =  $n * factorial( $n-1 );
  echo "Result of $n * factorial( " . ($n-1) . " ) = $result. Returning $result...<br>";
  return $result;
}

echo "The factorial of 5 is: " . factorial( 5 );


?>

应该是输出

5 = 5: Computing 5 * factorial( 4 )...
4 = 4: Computing 4 * factorial( 3 )...
3 = 3: Computing 3 * factorial( 2 )...
2 = 2: Computing 2 * factorial( 1 )...
1 = 1: Computing 1 * factorial( 0 )...
Base case: 0 = 0. Returning 1...
Result of 1 * factorial( 0 ) = 1. Returning 1...
Result of 2 * factorial( 1 ) = 2. Returning 2...
Result of 3 * factorial( 2 ) = 6. Returning 6...
Result of 4 * factorial( 3 ) = 24. Returning 24...
Result of 5 * factorial( 4 ) = 120. Returning 120...
The factorial of 5 is: 120

我想完全理解递归。我了解返回1之前必须满足基本情况(n = 0)的部分,我完全理解该部分。当满足基本情况时,...

php algorithm recursion
2个回答
0
投票

函数再次调用自身,并等待该答案继续计算。因此,假设您从N=2开始,就会发生这种情况:


0
投票

被调用时与您的函数或方法有关的所有数据都存储在堆栈中。因此,假设您调用函数factorial(5)来获取值5。现在,当您使用参数5调用函数时,它会被放入堆栈中,程序会尝试计算其值,现在在计算程序值时会将该程序赋值发现它的值取决于factorial(5-1),即5*factorial(4),因此停止计算factorial(5)的整体计算,它将保留在堆栈中,并且您的程序将把factorial(4)的值放入堆栈中。为了确定factorial(4),您的程序将需要factorial(3)的值,因此将被放置到堆栈上,因此当前堆栈看起来类似于[[factorial(5) with all its data] , [factorial(4) with all its data] , [factorial(3) with all its data]]整个功能的总体状态类似,程序将进一步维护将factorial(2)factorial(1)放入堆栈。现在,如果没有基本条件,则您的程序将由于stackoverflow而崩溃,因为您的程序将继续使用factorial(0)factorial(-1)等其他函数调用来填充堆栈。因此,我们需要一个基本案例。因此,当您的程序找到n==0直接获得其值的条件时,它将停止进一步将其他函数调用推入堆栈,然后开始处理当前堆栈,因此一旦获得factorial(0)的值,便会使用它来计算值返回factorial(1)的值,并在将factorial(1)的值返回到facotrial(1)之后从堆栈中弹出factorial(2)及其所有数据(因为从factorial(2) )调用了factorial(1),现在factorial(2)做同样的事情。)最后,堆栈将在元素被推入时从其中弹出元素,并且将计算出您最初调用的函数的最终值,即factorial(5)

© www.soinside.com 2019 - 2024. All rights reserved.