gpt4 book ai didi

javascript - 在 JavaScript 中使用递归获取范围数

转载 作者:行者123 更新时间:2023-11-29 17:57:02 25 4
gpt4 key购买 nike

我正在尝试使用递归获取数字范围。有人可以向我解释为什么它不起作用吗?

function range(x,y){
var results = [];
if(x === y){
return results;
}



return results.push(range(x + 1,y));
}

range(1,5);

最佳答案

递归的美妙之处在于您不需要局部变量 (var results)。您只需将状态作为参数传递给每个递归迭代:

const concat = (xs, y) => xs.concat(y);

const range = (x, y) => {
const rec = (x, y, acc) => x < y ? rec(x + 1, y, concat(acc, x)) : acc;
return rec(x, y, []);
}

ES5 版本以防你不熟悉箭头语法:

function concat(xs, y) {
return xs.concat(y);
}

function range(x, y) {
function rec(x, y, acc) {
return x < y ? rec(x + 1, y, concat(acc, x)) : acc;
}

return rec(x, y, []);
}

但这不是最优雅的解决方案!

通过递归,我们可以在每次递归调用时简单地构建堆栈。每个堆栈帧都包含一个计算出的部分结果。然后我们只需要展开堆栈并将每个部分结果附加到一个数组:

const range = (x, y) => x < y ? [x].concat(range(x + 1, y)) : [];

或更多功能:

const concat = (xs, y) => xs.concat(y);
const range = (x, y) => x < y ? concat([x], range(x + 1, y)) : [];

请注意,concat([x], range(x + 1, y)) 是递归情况,[] 是基本情况。

关于javascript - 在 JavaScript 中使用递归获取范围数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38175342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com