JavaScript递归,反转数组

JavaScript递归,反转数组,javascript,recursion,Javascript,Recursion,我不明白为什么下面的代码片段会导致错误。有什么想法吗 超过最大调用堆栈大小 功能反转arrayinplace(数组、低位、高位){ 如果(低==未定义){ 低=0; } 如果(高==未定义){ 高=数组长度-1; } 如果(低>=高){ 返回; } var temp=阵列[低]; 阵列[低]=阵列[高]; 阵列[高]=温度; 返回反向arrayinplace(数组,低++,高--); } var arrayValue=[1,2,3,4,5]; 反向放置(arrayValue); console

我不明白为什么下面的代码片段会导致错误。有什么想法吗

超过最大调用堆栈大小

功能反转arrayinplace(数组、低位、高位){
如果(低==未定义){
低=0;
}
如果(高==未定义){
高=数组长度-1;
}
如果(低>=高){
返回;
}
var temp=阵列[低];
阵列[低]=阵列[高];
阵列[高]=温度;
返回反向arrayinplace(数组,低++,高--);
}
var arrayValue=[1,2,3,4,5];
反向放置(arrayValue);

console.log(arrayValue)这是因为您使用的是后增量和后减量。它递增/递减变量,但返回旧值,因此在递归中传递旧值。因此,递归调用与原始调用相同,并且可以无限递归

预增量/减量--
++low
--high
--将正常工作。但是你根本不需要更新变量,因为你再也不用它们了。只要做普通的加法/减法


在进行递归调用时,使用
return reversearlayinplace()
也没有意义,因为基本情况不返回任何内容。只需进行递归调用,而无需将其放入
return
语句中

功能反转arrayinplace(数组、低位、高位){
如果(低==未定义){
低=0;
}
如果(高==未定义){
高=数组长度-1;
}
如果(低>=高){
返回;
}
var temp=阵列[低];
阵列[低]=阵列[高];
阵列[高]=温度;
反向放置(阵列,低+1,高-1);
}
var arrayValue=[1,2,3,4,5];
反向放置(arrayValue);

console.log(arrayValue),因为在递归调用中必须使用++低和--high。 在您的版本中,首先传递值,然后修改

功能反转arrayinplace(数组、低位、高位){
如果(低==未定义){
低=0;
}
如果(高==未定义){
高=数组长度-1;
}
如果(低>=高){
返回;
}
var temp=阵列[低];
阵列[低]=阵列[高];
阵列[高]=温度;
返回反向放置(阵列,++低,--高);
}
var arrayValue=[1,2,3,4,5];
反向放置(arrayValue);

console.log(arrayValue)
这意味着如果(低>=高)
未被命中,则表示基本情况。您总是会遇到递归情况,JS引擎最终会阻止这种情况,否则它将永远继续下去。也许这将有助于您调试算法。是的,没错,基本情况没有命中,问题是为什么准确地说,low随着每次调用而递增,high则递减,最后必须指出low>=high的条件才是真的。您应该学会使用调试器来跟踪这样的问题。或者至少放入一些
控制台.log
调用以跟踪传入的值。@TedHopp根本无法运行代码,因此无法使用调试器。谢谢你的建议。@TedHopp我怀疑他可能会在调试器中花费数小时,他永远也不会明白递归调用没有传递预期值的原因。OP也不需要递归调用的
返回值。谢谢,明白了,错过了这个例子。在进行递归调用时使用return也没有意义,因为基本案例不返回任何内容。请您澄清一下-我在基本情况下使用return只是为了退出函数。您使用
return
,但不使用
return someExpression
,因此它不返回任何内容。我不是要返回任何内容,我使用return退出递归调用;使用预增量和预减量是一种浪费;这些变量在递归调用后失效。只需使用
low+1
high-1
递归即可。