阶乘的求解思路:
5! = 5 * 4!
5! = 5 * 4 * 3!
5! = 5 * 4 * 3 * 2!
5! = 5 * 4 * 3 * 2 * 1!
1! =1;
计算5的阶乘时,没有立即计算出结果,需要求更低的阶乘
求5 的阶乘,核心:求其他数的阶乘。
定义一个求阶乘的函数fn: fn(5) = 5 * fn(4)
剩下的阶乘: fn($n )
在函数fn()中调用本身。
1.递归思想
1)介绍
将大问题拆分成多个小问题来解决。
小问题的解决方法与大问题的解决方法一致。
可以封装函数来解决大问题(求阶乘的函数fn)
小问题的解决可以通过调用该函数来fn实现,只是输入的参数不一致而已。
2)本质
由于小问题的解决方法与大问题的解决方法一致,函数内部去调用函数本身。
3)递归两要素
递归的调用点(入口):什么情况下函数开始调用本身。f(5) = 5 * f(4)
递归的出口。什么时候结束递归调用的问题。对于阶乘来说:计算1的阶乘,
4)应用:阶乘
5)递归的执行原理
调用一次函数,不会理解得到结果。需要按照新参数执行函数。不断的调用新的函数,直到拿到确定的值,再返回,逐层拿到计算结果。执行时占用的空间比较大。
迭代思想
百数之和:
在1+ 2 + 3+ 4…
将上一次运算的结果作为条件,计算下一个的结果
7)介绍
又称递推:
将已知条件作为迭代的原始值,不断有原始值计算出新值的过程。执行效率非常高。
Fibanacci数列 :
一对兔子生小兔子的问题:
1 1 2 3 5 8 13 21 34
斐波那契额数列:有如下一个数列:1, 2, 3, 5, 8, 13, 21,……. 其规则是:前两个已知(即1和2),从第3个开始,其值为其左边两个值的和(此数列称为斐波那契数列)。定义一个函数,该函数可以求出该数列的任意第n个数的值。
function Fei( $n ){
if ( $n==1 ) { //特例值
return 1;
} else if ( $n==2 ) { //特例值
return 2;
} else {
return Fei($n-1) + Fei($n-2); //递归调用
}
}
3.递归与递推的差异
递归在运行过程中不断开辟程序运行的内存空间,占用空间比较大。执行效率比较低。
但是在某些情况,如读取文件夹,由于不知道文件夹有多少层,此时只能使用递归思想。