使用递归范围,如何输出新数组Javascript

使用递归范围,如何输出新数组Javascript,javascript,arrays,recursion,Javascript,Arrays,Recursion,如何使用递归输出新数组,而不在函数外部声明空数组?另一种方法是创建一个内部函数,然后返回newFunction(),但这是不允许的,因为任务是调用函数本身。以下是我目前掌握的情况: var newArr=[]; var range = function(x, y) { if(x === y-1){ return newArr; } if(x < y){ newArr.push(x+1); newArr = range(

如何使用递归输出新数组,而不在函数外部声明空数组?另一种方法是创建一个内部函数,然后
返回newFunction()
,但这是不允许的,因为任务是调用函数本身。以下是我目前掌握的情况:

var newArr=[];
var range = function(x, y) {
    if(x === y-1){
        return newArr;
    }
    if(x < y){
        newArr.push(x+1);
        newArr = range(x+1,y);
    }
    else{
        newArr.push(x-1);
        newArr = range(x-1,y);
    }
    return newArr;
};
range(2,10) //[3,4,5,6,7,8,9]
var newArr=[];
变量范围=函数(x,y){
如果(x==y-1){
返回newArr;
}
if(x
因此,这种思考的关键是理解应该创建大量数组

看一个稍微不同的例子

阶乘是一个倒转的数字,通过正整数,将每个项与它下面的项相乘,写得像
5。
当你发现自己在问诸如:
“有多少种排列?”

“考虑到这5种情况,我可以从左到右排列多少排列?”

您可以看到我们如何构建一个循环,为计数器设置一个变量,为总数设置一个变量,然后将当前总数乘以我们正在递减的计数器的当前值

但是我们可以尝试使用递归,而不是那样做。 首先,考虑如何将
5x4x…
简化为一个重复步骤

真的,
2
2x1
<代码>3
3x2x1
,正好是
3x2

因此,一般情况可能是:
n!==nx(n-1)

所以我可以写一个广义函数,它的作用如下:

// DO NOT RUN THIS FUNCTION!
function factorial (n) {
  return n * factorial(n - 1);
}
因此,如果我运行
factorial(5)
并运用我的想象力,我们可以看到程序正在执行以下操作:

factorial(5)
  => return 5 * factorial(5-1)
    => return 4 * factorial(4-1)
      => return 3 * factorial(3-1)
        => ...
您能看到该功能的任何问题吗?
我一开始说阶乘(在这个简化的例子中)是正整数

当整数不再为正时,我的函数如何知道停止? 目前还没有。这就是为什么上面的实现试图永远运行,并且会在浏览器尝试运行时冻结浏览器,直到它达到数千或上万个函数的深度,然后它才会表示您已经达到调用堆栈的最大深度并爆发

我们真正需要的是一个条件或一组条件,我们用它来决定何时完成。 这是一个基本情况

if (shouldStop(n)) {
  return defaultValue;
}
或者在我们的情况下:

function factorial (n) {
  if (n <= 1) {
    return 1;
  }
  return n * factorial(n - 1);
}
这是递归。 由于调用的位置(在所处分支的最末端返回),它是一种特殊的递归(尾部递归),它允许一些语言优化代码,用函数调用的内容替换函数调用,从而像第一个版本那样跳过添加到调用堆栈中(JS的未来版本将支持此功能)

在更现代的JS中,我可能会重写它,使其看起来像

const factorial = n => n <= 1 ? 1 : factorial(n - 1);
还有其他方法可以填充该函数,使其执行相同的操作。 请注意,
currentString
总有一个全新的字符串,它是通过将给定的字符串与传递的新值连接起来而形成的。我实际上并没有修改原始字符串,而是创建一个新的副本[HINT!!]


我希望这对您有所帮助。

因此,这种思考的关键是理解您应该创建大量数组

看一个稍微不同的例子

阶乘是一个倒向的数字,通过正整数,将每个项与它下面的项相乘,写得像
5!
。 当你发现自己在问诸如:
“有多少种排列?”

“考虑到这5种情况,我可以从左到右排列多少排列?”

您可以看到我们如何构建一个循环,为计数器设置一个变量,为总数设置一个变量,然后将当前总数乘以我们正在递减的计数器的当前值

但是我们可以尝试使用递归,而不是那样做。 首先,考虑如何将
5x4x…
简化为一个重复步骤

实际上,
2!
2x1
3!
3x2x1
,正好是
3x2!

所以一般情况可能是这样的:
n!==nx(n-1)!

所以我可以写一个广义函数,它的作用如下:

// DO NOT RUN THIS FUNCTION!
function factorial (n) {
  return n * factorial(n - 1);
}
因此,如果我运行
factorial(5)
并运用我的想象力,我们可以看到程序正在执行以下操作:

factorial(5)
  => return 5 * factorial(5-1)
    => return 4 * factorial(4-1)
      => return 3 * factorial(3-1)
        => ...
您能看到该功能的任何问题吗?
我一开始说阶乘(在这个简化的例子中)是正整数

当整数不再为正时,我的函数如何知道停止? 目前还没有。这就是为什么上面的实现试图永远运行,并会在尝试运行时冻结浏览器,直到它达到数千或上万个函数的深度,然后它才会表示您已达到调用堆栈的最大深度并爆炸

我们真正需要的是一个条件或一组条件,我们用它来决定何时完成。 这是一个基本情况

if (shouldStop(n)) {
  return defaultValue;
}
或者在我们的情况下:

function factorial (n) {
  if (n <= 1) {
    return 1;
  }
  return n * factorial(n - 1);
}
这是递归。 由于调用的位置(在所处分支的最末端返回),它是一种特殊的递归(尾部递归),它允许一些语言优化代码,用函数调用的内容替换函数调用,从而像第一个版本那样跳过添加到调用堆栈中(JS的未来版本将支持此功能)

在更现代的JS中,我可能会重写它,使其看起来像

const factorial = n => n <= 1 ? 1 : factorial(n - 1);
还有其他方法可以填充该函数,使其执行相同的操作。 请注意