我正在尝试使用递归来获取数字范围。有人可以向我解释为什么它不起作用吗?
function range(x,y){
var results = [];
if(x === y){
return results;
}
return results.push(range(x + 1,y));
}
range(1,5);
答案 0 :(得分:3)
尝试一下:
function rangeOfNumbers(startNum, endNum) {
if (startNum - endNum === 0) {
return [startNum];
} else {
const numbers = rangeOfNumbers(startNum + 1, endNum);
numbers.unshift(startNum);
return numbers;
}
};
答案 1 :(得分:2)
递归之美是你不需要局部变量(Content-Type: text/plain
)。您只需将state作为参数传递给每个递归迭代:
var results
ES5版本,以防您不熟悉箭头语法:
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, []);
}
这不是最优雅的解决方案!
使用递归,我们可以简单地使用每个递归调用构建堆栈。每个堆栈帧包含计算的部分结果。然后我们只需要展开堆栈并将每个部分结果附加到一个数组:
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))
是基本情况。
答案 2 :(得分:1)
结果将始终为空,因为您实际上没有放任何东西。
这将是什么工作
function range(x,y){
var results = [];
if(x === y){
return results;
}
results.push(x);
return results.concat(range(x + 1,y));
}
range(1,5);
答案 3 :(得分:1)
解决方案: 解决了此递归问题,该问题采用2个数字作为输入,并返回包含包含startNumber和EndNumber在内的数字范围的数组
假设-> end_num始终大于start_num
function rangeOfNumbers(start_num, end_num) {
if(start_num!==end_num){
let numbers = rangeOfNumbers(start_num+1,end_num);
numbers.unshift(start_num);
return numbers;
}
else
return [start_num];
};
答案 4 :(得分:0)
在给出解决方案之前,让我们首先尝试回答您的“为什么”问题,因为这些答案都无法解释您的“为什么”问题。
当您返回 results.push(<any argument>)
时,返回值是推送后数组的长度。在您的示例中的第一次调用中,x 不等于 y,因此我们将调用返回到 push。你可以这样想:
return array.push(<anything>)
将等同于:
array.push(<anything>)
return array.length
因此,您将始终从中返回数字 1
,因为当您将函数调用推送到数组时,数组的长度为 1。该数组的内容将是另一个嵌套到n 层深,其中 n 是范围,但它的长度仍然是 1,除非你这样做,否则你永远不会看到这个数组的内容:
results.push(rangeOfNumbers(x+1, y))
return results;
在您的示例 rangeOfNumbers(1, 5)
中,如果您记录了 那个 返回值,它将如下所示:
[ [ [ [ [ ] ] ] ] ]
我是这样解决的,但我更喜欢另一个用户发布的功能解决方案:
function rangeOfNumbers(s, e) {
return s == e ? [s] : [s, ...rangeOfNumbers(s+1, e)];
}