先看一个试题: 求n的阶乘
通常,我们会写:
function fac(num){
var res = 1;
for(var i = 1; i <= num; i++){
res *= i;
}
return res;
}
观察阶乘可以发现两个特点:
特点一:有规律
5! = 5 * 4 * 3 * 2 * 1
发现 5 的阶乘等于 5 乘以 4 的阶乘,同理,4 的阶乘是 4 乘以 3 的阶乘。
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
... ...
特点二:有出口
出口是已知的,就是 1 的阶乘等于 1.
1! = 1
根据这两个特点,可以把函数改一下;
function fac(num){
if(num == 1){ // 出口条件
return 1; // 出口的值已知
}
return num * fac(num -1); // 抽象出规律
}
可以再推倒一遍:
fac(5);
fac(5) ==> 5 * fac(4); // 想知道 5 的结果,就得需要先知道 4 的结果
fac(4) ==> 4 * fac(3); // 想知道 4 的结果,还得先知道 3 的结果
fac(3) ==> 3 * fac(2); // 想知道 3 的结果,得先知道 2 的结果
fac(2) ==> 2 * fac(1); // 想知道 2 的结果,得先知道 1 的结果
fac(1) ==> 1 已知 // 1 的结果已知,往上反推回去
fac(2) = 2 * 1;
fac(3) = 3 * 2;
fac(4) = 4 * 6;
fac(5) = 5 * 24; // 120
这就是用递归的方法来解决。
递归比较符合人的思维,找到规律和出口,就可以使用递归的思想来写代码。