2016-03-22 6 views
0

この再帰JavaScriptを呼び出すと、「最大呼び出しスタックサイズ超過エラー」というエラーが発生します。再帰により、「最大呼び出しスタックサイズ超過エラー」エラーが発生します。

これは私のコードです:

var num = 12 
 
,maxlength = 50; 
 
var lengths = [5,6,7,8,4,4,5,6,3,3,2,2]; 
 

 
function knap(maxlength,num){ 
 
\t if(maxlength==0) return 1; 
 
\t if(maxlength<0||(maxlength>0&&num<1)){ 
 
\t \t return 0; 
 
\t } 
 

 
\t if(knap(maxlength-lengths[num],num-1)){ 
 
\t \t console.log(lengths[num]+" ") 
 
\t \t return 1; 
 
\t } 
 

 
\t return knap(maxlength,num-1); 
 
} 
 

 
if(knap(maxlength,num)){ 
 
\t console.log('Yes'); 
 
}else{ 
 
\t console.log('No'); 
 
}

私はこれを理解できますか?

+2

参照してください、あなたは無限に自分自身を呼び出す関数を持っている、あなたは '50'に渡すので、ステートメントに該当する場合、それは終わりになり、関数を呼び出すのどれも再び「50」と同じ事が繰り返されます。 – adeneo

+1

終了条件は正しいですか? maxlengthは常に同じです –

+0

Aha、最初の反復後maxlength eq NaN。 :)終了条件は常にfalseです。 –

答えて

1

初めてnumを呼び出すと、lengthの長さを超えています。したがって、式maxlength-lengths[num]if(knap(maxlength-lengths[num],num-1))であり、NaNです。その後、すべてのブレーク再帰条件は常にfalseです。 おそらく、最初にknap(maxlength,num-1)と呼ぶ必要があります。

+0

ありがとうございます、あなたは最も役に立つと思います! –

0

これは、呼び出しスタックの制限に達するまで、そして再帰のためにほとんどの時間がかかるまで、あなたのコードのどこかで、別の関数などを呼び出す関数を呼び出していることを意味します。

を把握する多くはありませんMaximum call stack size exceeded error

関連する問題