我正在尝试使用递归获取数字范围。有人可以向我解释为什么它不起作用吗?
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/