递归函数的理解
对于递归函数的理解,足足花了一天,从刚开始根本想不通为什么会倒过来输出,直到认识其中的原理。接下来,先简单地理解一下,后面再讲原理。
代码例子:

当$n=10时,301行代码输出:10,下一步进入if条件判断。
当运行到test($n-1),即test(9)时,程序下一步跳转到299行代码,接着301行代码输出:9,以此类推,输出结果:10 9 8 7 6 5 4 3 2 1 0
当$n=0时,不符合if条件,309行代码输出:<-->,312行代码输出:0
现在回想过来,当$n=10,9,8,7,6,5,4,3,2,1时,代码都没有执行完毕,意思是接下来需要执行完305-312行的代码,所以需要返回上一层,即$n=1,以此类推
代码执行完输出的结果:
10 9 8 7 6 5 4 3 2 1 0 <--> 0 1 2 3 4 5 6 7 8 9 10
换一个更形象的例子,说明实质原理
代码例子:

先看看这段代码输出的结果

首先,我们需要了解“栈”,栈是先进后执行

第一步:当$i=3时,Recursive(3)先进栈,269行代码输出:Recursive()函数当前的$i=3,接着进入if条件判断,但不符合条件,下一步是else语句。
关键的一句代码就在278行,$sum=3*Recursive(2)。
要想知道Recursive(3)的值,就必须知道Recursive(2)值。
第二步:这时程序跳转到266行,Recursive(2)进栈,开始执行Recursive(2),输出:Recursive()函数当前的$i=2。
程序来到278行,$sum=3*Recursive(2)。
要想知道Recursive(2)的值,就必须知道Recursive(1)值。
第三步:当$i=1时,输出:Recursive()函数当前的$i=1,符合if条件,输出:i=1, sum=1
第四步:程序运行到283,输出:i=1, sum=1。
第五步:返回$sum=1
此时,我们已经知道Recursive(1)的值,就是$sum=1。
刚才说过:
要想知道Recursive(2)的值,就必须知道Recursive(1)值
此时程序将Recursive(1)返回的值,传递给Recursive(2)
第六步:程序运行到278行代码,$sum=2*Recursive(1) (2=2*1)
第七步:283行代码输出:i=2,sum=2
要想知道Recursive(3)的值,就必须知道Recursive(2)值。
此时程序将Recursive(2)返回的值,传递给Recursive(3)
第八步:程序运行到278行代码,$sum=3*Recursive(3) (6=3*2)
第九步:283行代码输出:i=3,sum=6
所以利用递归函数,实现阶乘的结果
