2012-04-03 15 views
0

私は一般的には少し失われていますが、誰かがこのコードがうまくいく理由を簡単に説明できたら嬉しいです!名前の再帰

// Our array of messy words 
var capitals = ["berlin", "parIs", "MaDRiD"]; 

// Capitalize function 
function capitalize(word) { 
    return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); 
} 

// Our recursive function 
function fixLetterCase(array, i) { 
    // Base case 
    if (i === array.length) { 
     return; 
    } 
    // Action 
    array[i] = capitalize(array[i]); 
    // Recursive case 
    return fixLetterCase(array, i + 1); 
} 

// Here is our function call 
fixLetterCase(capitals, 0); 

console.log(capitals); 
+0

正確にあなたは立ち往生していますか? –

+0

私はちょうど起こっていることすべてを理解していません。それは混乱している – Sam

+0

しかし、あなたはそれが再帰だと知っています。だから、あなたは少なくとも何かを知っている*。だから、コードのどの部分があなたに魔法のように見えるのですか?コードの理解を深めるには何が必要ですか? –

答えて

1

私はこの質問への答えではありません理解している間、私はそれがロジックの非再帰的なバージョンを確認するのに役立つかもしれないと思った:

// Our array of messy words 
var capitals = ["berlin", "parIs", "MaDRiD"]; 

// Simple function to capitalize word 
function fixLetterCase(array) { 
    for(var i = 0; i < array.length; i++) { 
     array[i] = array[i].charAt(0).toUpperCase() + array[i].slice(1).toLowerCase(); 
    } 
} 

fixLetterCase(capitals); 
console.log(capitals);​ 

ここで私はあなたがいると仮定しa working fiddle to play with.

1
function fixLetterCase(array, i) { 
    // At some point, this is true, so the algorithm stops 
    if (i === array.length) { return; } 
    // At this point, the function did not returned. The function logic continues. 

    // Replace the array key with a new value = the return value of captialize() 
    array[i] = capitalize(array[i]); 

    // i increments by one, and the function itself is called again. 
    return fixLetterCase(array, i + 1); 
} 

// Initialize the function, with starting offset ("counter") i=0 
fixLetterCase(capitals, 0); 
0

機能fixLetterCaseはゼロに等しいiと呼ばれます。最初にfixLetterCaseを実行すると、配列の最初の単語のcapitalizeが呼び出されます。再帰呼び出しでは、iを1でインクリメントします。つまり、配列の次の単語を大文字に変換します。配列の終わりに達するまでこれを続けます。

これは、関数が機能する理由です。大文字にする必要がある単語のインデックスは毎回増加し、最後の呼び出しでは、インデックスが配列の長さと等しい場合、 'recursion'は終了します。

再帰呼び出しから何も返されないため、これは一般的な再帰呼び出しではありません。また、これはforループとしてより簡単に書くことができます。

0

これは本当にあなたが再帰部分のみを資本の言葉を反復して、配列の末尾に達したときにエスケープされ

// Our array of messy words 
var capitals = ["berlin", "parIs", "MaDRiD"]; 

// Capitalize function 
function capitalize(word) { 
    return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); 
} 

// Our recursive function 
function fixLetterCase(array, i) { 

    // Action 
    array[i] = capitalize(array[i]); 
} 

// Here is our function call 
for(var i = 0; i < capitals.length; i++) 
{ 
    fixLetterCase(capitals, i); 
} 

console.log(capitals); 

と同じことを行うことができ、recursivly書き込む必要はありません。このように読んでほしいと願っています。

1
// Our recursive function 
function fixLetterCase(array) { 
    for (var i = 0, length = array.length; i < length; i++) { 
     array[i] = capitalize(array[i]); 
    } 
} 

おそらく、より読みやすく、よりパフォーマンスの高いソリューションになるでしょう。このケースは再帰を必要とせず、ループがより効果的でなければなりません。多くの関数呼び出しは必要なく、関数呼び出しごとに配列の長さを評価する必要はありません。

1

です再帰的な部分について話す。これは実際に配列を反復処理するエキゾチックな方法です。

:あなたのようにそれを行うことができます再帰で

for ([initialization]; [condition]; [modification]) 
    [function] 

あなたがパターン以下、forループでこれを行う可能性があります従来(全く奇妙な擬似コード、私自身の総発明を許します)

[function [initialization]] 
    if [!condition] 
    break 
    [function [modification]] 

このケースでは再帰バージョンにはあまり効果がないと私は個人的に感じます。パフォーマンス上のメリットはありません。