在JavaScript中使用递归获取范围编号

时间:2016-07-03 23:51:27

标签: javascript recursion range

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

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



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

range(1,5);

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)];
}