使用递归范围,如何输出新数组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);
还有其他方法可以填充该函数,使其执行相同的操作。
请注意