2017-04-14 39 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」遞歸。 –