0
点赞
收藏
分享

微信扫一扫

递归的讲解


函数中调用函数自己,就是递归,递归一定要有结束条件

递归实现阶乘(1*2*3*…*n的值)

var factorial function (n){
if (n <= 1) return 1;
return factorial(n -1) * n;
}
console.log(factorial(5)) //120

斐波那契数列

1, 1, 2, 3, 5, 8, 13……即从第三项起,每一项的值是前两 项值的和。现在求第n项的值。

var fibona = function (n) {
if (n === 11 || n === 2) return 1;
return fibona(n - 1) + fibona(n - 2);
}
console.log(fibona(4)) //3

递归实现深拷贝

var isObject = function (obj) {
var type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
}

var deepClone = function (obj) {
if (!isObject(obj)) return obj;
var result = new obj.constructor();
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
result[i] = deepClone(obj[i]);
}
}
return result;
}

递归适合:

当一个问题可以层层分解成最小的 :简单问题时。

递归缺点:

1、每一次函数的自身调用都需要在栈中分配空 间保存参数,数据入栈和返回地址也需要时 间。所以多次函数调用消耗了时间和空间。 

2、每个进程的栈容量有限,多次调用函数可能 :会导致栈溢出。

3、由于递归本质是把一个问题拆解成多个小问题进行计算,会存在重复计算的情况。如斐波那契数列的递归实现。

fibona(5) = fibona(4) + fibona(3)

fibona(4) = fibona(3) + fibona(2)

fibona(3) =fibona(2) + fibona(1)

fibona(3)和fibona(2)重复计算


举报

相关推荐

0 条评论