2015-12-11 29 views
1

我對JavaScript比較陌生。我從概念上理解遞歸併瞭解它的價值。但是,我發現自己對實際發生的事情有些困惑。我知道這不是扭轉字符串的最簡單方法。但我使用它作爲一個簡單的例子使用遞歸反轉字符串時實際發生了什麼

function reverse(str){ 
if (str === ""){ 
    return ""; 
    } else { 
     return reverse(str.substr(1)) + str.charAt(0); 
    } 
    } 

所以怎麼樣了也像一個字符串「hello」,成爲「2009東海生日賀」的時候,碼告訴我們遞歸地把第一個字符在字符串的結尾處爲(elloh)?希望我的問題有道理。在此先感謝

+0

'console.log(str.substr(1));' – epascarello

回答

2

遞歸函數有兩種情況:基本情況和遞歸情況。這裏,基本情況是if (str === ""){ return ""; },遞歸情況是return reverse(str.substr(1)) + str.charAt(0)

考慮基本案例:reverse("")產生""。這很簡單!

現在讓我們考慮第二個最簡單的情況:reverse("c")。這導致reverse(str.substr(1)) + str.charAt(0)成爲reverse("") + "c",我們可以很容易地看到它只是"c"

接下來,reverse("bc")。在這種情況下,表達式reverse(str.substr(1)) + str.charAt(0)變成reverse("c") + "b"。我們從上面知道reverse("c")只是"c"。因此,我們看到reverse("c") + "b""cb"

最後,讓我們畢業後去瞭解reverse("abc")。這裏遞歸的情況是reverse("bc") + "a"。我們如何弄清楚reverse("bc")是什麼?我們真的做到了!依靠剛剛給出的解釋,我們知道reverse("bc")"cb",所以reverse("bc") + "a""cba"

4

該函數將給定字符串的第一個字符放在'return'語句的末尾。 然後,通過刪除舊字符串的第一個字符並再次執行相同的操作,函數被稱爲recursivly。迭代是這樣的:

輸入字: '你好'

first iteration: return reverse('ello') + 'h' // returned word until now: 'h' 
second iteration: return reverse('llo') + 'e' // returned word until now: 'eh' 
third iteration: return reverse('lo') + 'l' // returned word until now: 'leh' 
fourth iteration: return reverse('o') + 'l' // returned word until now: 'lleh' 
fifth iteration: return reverse('') + 'o' // returned word until now: 'olleh' 
sixth iteration: return '' // loop finished and returned word is 'olleh' 

希望這有助於

+0

幫了一下! –

1

調用reverse("hello")

遞歸調用

 Function Call      Returning string 
return reverse(str.substr(1)) +  str.charAt(0); 

以下IT在每個步驟

 Recursive Calls        Returning strings 
     reverse("ello")         + "h"; 
      reverse("llo")       + "e" 
       reverse("lo")     + "l" 
        reverse("o")   + "l" 
         reverse("") + "o" 

沒有更多的遞歸返回子解決方案

   + "h"; 
      + "e" 
     + "l" 
    + "l" 
+ "o" 
----------------------------- 
"o"+"l"+"l"+"e"+"h" =   "olleh" ("hello" reversed) 
0

我明白了。所以它從字符串中取出字母並以相反的順序返回,直到原始字符串爲空。

非常感謝!