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

标签 javascript recursion range

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

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/

相关文章:

javascript - lambda : convert key value array to object

javascript - 使用 StupidTable JS 和日期列进行排序

c - 不使用 exit 语句的递归。,

Matlab:从一定范围内不重复的随机整数

javascript - 如何将简单的查询字符串 jQuery 脚本添加到 WordPress

file - 在 Kotlin 中递归列出文件

java - 递归:传递给函数的变量是否需要跟踪和更新?

groovy - 在 IntRange 上调用 .each{} 返回范围而不是每个整数

algorithm - 快速算法在一组范围中快速找到一个数字所属的范围?

c# - JSON 数据结构 - JSON 到对象 - 最佳实践