尾递归php,递归的真相,请不要相信什么尾递归可以优化递归代码!

网上很多人传言,尾递归能优化“栈溢出”,事实真的如此吗?

吃瓜群众,遇到这种事最好的方法就是自己亲自测试一下。

下面是三段递归累加代码对比:

// 普通 递归

function factorial1(n) {

if (n === 1) return 1;

return n + factorial1(n - 1);

}

// 尾递归

function factorial2(n, total) {

if (n === 1) return total;

return factorial2(n - 1, n + total);

}

// 函数式传参递归

function factorial13Callback(n,callback){

if (n === 1) return 1;

return n + callback(n - 1, callback)

}

function factorial13(n, callback) {

if (n === 1) return 1;

return n + callback(n - 1, callback);

}

a7f9d16726fa675aaa7c3aa18025f1ff.png

node  测试,上述截图未node 版本

// 普通递归可以支撑 11399次数

console.log(factorial1(11399))

console.log(factorial2(10449,1))

console.log(factorial13(10449, factorial13Callback))

// 尾递归 和 函数式传参递归 都只能支撑 10449次数

11399  >  10449

上述代码只要多加一次递归就是报 “栈溢出”

console.log(factorial1(11399))

console.log(factorial2(10449,1))

console.log(factorial13(10449 + 1, factorial13Callback))

87497e4a04e40935154aa9073c165a23.png

浏览器递归最大支撑,同样,多加1就会“栈溢出”

d4ca0dba7cccf6975b992ab6551ca65c.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值