0
点赞
收藏
分享

微信扫一扫

【笔记05】Javascript - 基本概念 - (函数递归)

先看一个试题: 求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

这就是用递归的方法来解决。

递归比较符合人的思维,找到规律和出口,就可以使用递归的思想来写代码。


举报

相关推荐

0 条评论