2017-11-09 11 views
-3

再帰を使用して配列内の整数の和を求める必要があります。 次のコードは、エラーがスローされます:この再帰の理解に問題があります

var sum = function(array) { 
    if(array.length === 0) return 0; 
    while(array.length) { 
     sum = array[0] + sum(array.slice(1)); 
     return sum; 
    } 
} 

この作品ながら:

var sum = function(array) { 
    if(array.length === 0) return 0; 
    while(array.length) { 
     return array[0] + sum(array.slice(1)); 
    } 
} 

差が合計が返される方法です。誰か説明できますか?

+0

プログラミング言語は何ですか? – STF

+0

'sum = array [0] + sum(array.slice(1));'ローカル関数名をオーバーライドし、 'sum'は2回目のwhileループの関数を参照しません。実際には、ループの内側から戻るので、2回目のラウンドはありません。 – Teemu

答えて

0

コメントで述べたように、whileループは決してループしません。ループ条件を2回テストする前にreturn文を実行します。

でも、なぜ最初のバージョンは最初に呼び出されますが、2番目のバージョンは呼び出されませんか?

sum = array[0] + sum(array.slice(1)); 

格納sum戻るへの関数呼び出しの後sumにおける右側の式の値、。その変数は有効範囲内にあるので、代入は有効です。

ただし、sum(右手側)への呼び出しが返されるまで割り当ては行われません。 sumが返るたびに、代入によって変数sumが部分的に、最終的に最終結果に上書きされます。

したがって、最初の呼び出しは正常に動作しますが、最初の呼び出しの結果にはsumが設定されます。番号を呼び出すことはできないので、2回目に呼び出すとエラーになります。

関連する問題