原创

js-递归-尾递归-不会内存溢出

//recursion 递归
function recursion(func) {
var value;
var active = false;
var accumulated = [];

return function accumulator() {
accumulated.push(arguments); //每次将参数传入. 例如, 1 100000
if(!active) {
active = true;
while(accumulated.length) { //出循环条件, 当最后一次返回一个数字而不是一个函数时, accmulated已经被shift(), 所以出循环
value = func.apply(this, accumulated.shift()); //调用累加函数, 传入每次更改后的参数, 并执行
}
active = false;
return value;
}
};
}

//var sum = recursion(function(x, y) {
// if(y > 0) {
// return sum(x + 1, y - 1) //重点在这里, 每次递归返回真正函数其实还是accumulator函数
// } else {
// return x
// }
// });

// var result = sum(1, 100000); //实际上现在sum函数就是accumulator函数
// console.log(result)

var new_num = 0;
var sum = recursion(function(num, callback) {
new_num = num + 1
if(num >= 20000) {
callback(num);
return
}
return sum(new_num, callback); //callback别漏了
});

var result = sum(1, function(num) {
console.log("num==" + num); //正常打印
});
console.log("result==" + result); //result 打印为 undefined ,说明可以通过callback做到有序

// 尾递归 不能解决栈溢出问题
// function recursion2(num) {
// new_num = num + 1
// if(num >= 20000) {
// return
// }
// console.log("尾递归|第", new_num, "次调用")
// return recursion2(new_num);
// 通过return方式的尾递归一样有栈溢出的问题
// (有的说js环境需要严格模式,未测试)
// }
// var res = recursion2(1);
// console.log("res=="+res);//res 打印为 undefined ,说明可以通过callback做到有序
正文到此结束
本文目录