2014-12-11 205 views
4

我已經嘗試下面的遞歸字符串逆轉:JavaScript的遞歸反向串

function reverse(str){ 
    var results =[]; 
    var j =0; 
    if(str.length === 0){ 
     console.log('this is zero, yo'); 
     return results.join(''); 
    } 

    results[j] = str[str.length -1]; 
    console.log('results: ' + results); 
    j++; 
    var next = str.substring(0,str.length -1); 
    console.log(next); 
    return reverse(next); 
} 
try{ 
    console.log('***'); 
    console.log(reverse('testing')); 
} 
catch(e){ 
    console.log('blew the stack'); 
} 

不幸的是,結果被設置爲空字符串的函數運行的最後一次。我應該創建一個返回results的內部函數,因此它沒有設置爲空字符串?這段代碼是否關閉?

編輯:這是爲了好奇,我試圖不使用,使得它很容易的功能(反向())

+0

你想與'results'陣列做什麼,我沒有得到評估。嘗試編寫一個沒有任何數組的代碼,只使用sting切片和連接。 – Bergi 2014-12-11 04:45:31

+0

我原本是用while循環完成的。但我知道我不能像正常的那樣在遞歸函數中聲明變量。 – Rico 2014-12-11 04:51:50

+0

好吧,你*可以*用內部函數做這樣的 - 在實際的遞歸函數之外聲明'results',這會佔用while循環的一部分(並且通過'j'遞歸);但我認爲這不是你鍛鍊的重點。 – Bergi 2014-12-11 04:53:50

回答

3

在你的代碼的問題是,你每省略最後一個字符並在最後一次遞歸調用中返回空字符串。

取而代之,獲取字符串的最後一個字符並追加字符串其餘部分的反轉值。

您可以實現像這樣

function reverse(str) { 
    if (str.length === 0) { 
     return ""; 
    } 

    return str[str.length - 1] + reverse(str.substring(0, str.length - 1)); 
} 

這裏,reverse("abc")會這樣

"c" + reverse("ab") 
"c" + ("b" + reverse("a")) 
"c" + ("b" + ("a" + reverse("")))  // Hits the `base condition` of recursion 
"c" + ("b" + ("a" + ""))    // Unwinding begins here 
"c" + ("ba") 
"cba" 
+1

或者,更容易的做'reverse(str.slice(1))+ str [0]':-) – Bergi 2014-12-11 04:48:27

+0

@Bergi當然,但我認爲他會更容易理解,如果我使用他的構造原始代碼:) – thefourtheye 2014-12-11 04:49:57