2017-04-14 68 views
0

我不明白为什么下面的代码片段导致错误。有任何想法吗?JavaScript递归,反转数组

最大调用堆栈大小超过

function reverseArrayInPlace(array, low, high) { 
 
    if (low == undefined) { 
 
    low = 0; 
 
    } 
 
    if (high == undefined) { 
 
    high = array.length - 1; 
 
    } 
 

 
    if (low >= high) { 
 
    return; 
 
    } 
 

 
    var temp = array[low]; 
 
    array[low] = array[high]; 
 
    array[high] = temp; 
 

 
    return reverseArrayInPlace(array, low++, high--); 
 
} 
 

 
var arrayValue = [1, 2, 3, 4, 5]; 
 
reverseArrayInPlace(arrayValue); 
 
console.log(arrayValue);

+1

这意味着您的碱的情况下,如果'(低> =高)'没有被击中。你总是会遇到递归的情况,JS引擎最终会阻止它,否则它会永远持续下去。也许这会帮助你调试算法。 – joews

+0

是的,真的,基本情况没有被打中,问题就是为什么每次调用都会增加低,而高度递减,最终必须指出low> = high的条件为真 – fg78nc

+0

您应该学会使用调试器来追踪这样的问题。或者至少放一些'console.log'调用来跟踪传入的值。 –

回答

7

这是因为你使用后递增和后递减。它递增/递减变量,但返回旧值,所以您在递归中传递旧值。因此,递归调用与原始调用相同,并且无限递归。

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

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

function reverseArrayInPlace(array, low, high) { 
 
    if (low == undefined) { 
 
    low = 0; 
 
    } 
 
    if (high == undefined) { 
 
    high = array.length - 1; 
 
    } 
 

 
    if (low >= high) { 
 
    return; 
 
    } 
 

 
    var temp = array[low]; 
 
    array[low] = array[high]; 
 
    array[high] = temp; 
 

 
    reverseArrayInPlace(array, low + 1, high - 1); 
 
} 
 

 
var arrayValue = [1, 2, 3, 4, 5]; 
 
reverseArrayInPlace(arrayValue); 
 
console.log(arrayValue);

+2

OP也不需要递归调用的'return'。 –

+0

谢谢,明白了,错过了这个案子。 – fg78nc

+0

在进行递归调用时,使用return也没有意义,因为基本情况不会返回任何内容。 请您澄清一下 - 我在基本情况下使用return来退出函数。 – fg78nc

0

,因为你必须在递归调用使用++低 - 高。 在您的版本中,值首先被传递,然后被修改。

function reverseArrayInPlace(array, low, high) { 
 
    if (low == undefined) { 
 
    low = 0; 
 
    } 
 
    if (high == undefined) { 
 
    high = array.length - 1; 
 
    } 
 

 
    if (low >= high) { 
 
    return; 
 
    } 
 

 
    var temp = array[low]; 
 
    array[low] = array[high]; 
 
    array[high] = temp; 
 

 
    return reverseArrayInPlace(array, ++low, --high); 
 
} 
 

 
var arrayValue = [1, 2, 3, 4, 5]; 
 
reverseArrayInPlace(arrayValue); 
 
console.log(arrayValue);

+0

使用预增和预减是浪费;这些变量在递归调用后死了。用“低+ 1”和“高 - 1”递归。 –