我想完全理解递归。我了解返回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)的部分,我完全理解该部分。当满足基本情况时,...
函数再次调用自身,并等待该答案继续计算。因此,假设您从N=2
开始,就会发生这种情况:
被调用时与您的函数或方法有关的所有数据都存储在堆栈中。因此,假设您调用函数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)
。