2016-08-29 4 views
1

私は今朝codewarsにいましたが、再帰メソッドを介してパラメータとして渡された文字列を逆にする関数を求めるこのKataがあります。この再帰的なjavascript関数を説明してください

この問題の最も良い解決策はこれでした。

function reverse(str) { 
    return str.length > 1 ? reverse(str.slice(1)) + str[0] : str; 
} 

私はすべての今朝、このために研究し、私はまだここで何が起こっているのか分からない:

+ str[0] 

誰かが私のためにこれを明確にしてくださいことはできますか?

+0

「最良のソリューション」とは、最良の再帰的なソリューションを意味しますか?私はこれが文字列を逆にする効率的な方法であるかどうかは疑問だ。 –

+0

再帰呼び出しが末尾にないため、これは悪い解決策です。対象をよりよく理解するために、関数を末尾再帰バージョンに変換してみてください。ヒント:アキュムレータ通過スタイル。 – ftor

答えて

2

機能の本質は以下の通りです:

  1. 番目の文字から最後の
  2. に部分文字列を取る
  3. は、最初の文字を取り、最後にそれを追加し
  4. 再帰的に逆関数を適用再帰呼び出し
  5. 戻る結果

の結果

これは、次のロジックになる括弧で示される(再帰的)関数呼び出し:

(A B C D E) 
((B C D E) A) 
(((C D E) B) A) 
((((D E) C) B) A) 
(((((E) D) C) B) A) 
+0

ありがとうございました! – notforever

1

str.slice(1)「チョップオフ」の文字列の最初の文字と、それの残りの部分を返します。だから'abcd'.slice(1)'bcd'です。

str[0]は、文字列の最初の文字です。 'abcd'[0]'a'です。

したがって、str.slice(1) + str[0]は、文字列の最初の文字を取り、最後に移動します。'abcd''bcda'になります。

これはソリューションの再帰的な性質には対処しませんが、+ str[0]についてのご質問にお答えします。

0

+演算子は、文字列の連結子です。 あなたは代わりにこのCONCAT使用することができます。

var reverse = str => str.length > 1 ? reverse(str.slice(1)).concat(str[0]) : str; 
console.log(reverse("123456789")); // 987654321 
1

私はより「人間が読める」ように機能を書き直してみます

reverse = str => { 

    // If there is still string to reverse 
    if (str.length > 1) { 
     let firstChar = str[0] 
     let strWithoutFirstChar = str.slice(1) 

     // Notice only a part of the string 'comes back' here 
     // console.log(strWithoutFirstChar) // Might help 
     return reverse(strWithoutFirstChar) + firstChar 
    } 

    // Else return result as is 
    else { 
     return str 
    } 

} 

これは、同じ機能であるが、三元系なしと宣言よく名付けられた変数。

あなたはconsole.log()行のコメントを解除して呼び出す場合:

reverse('help'); 

を出力は次のようになります。

elp 
lp 
p 
'pleh' 

それが役に立てば幸い!

関連する問題