2017-01-20 3 views
-1

なぜスタックオーバーフローエラーが発生するのですか?これは私が開始する前に再帰的にこれを解決しようとしていますダイナミックプログラミングを使い始める。メソッドコインでは、 "a"は、私が望む合計を形成するコインを保持する配列であり、sumは合計(例えば17)であり、iは配列iのインデックスを表すamでfind 1,5,10,25,50セントを使用して合計17cents(たとえば)を取得する方法の数

import java.util.*; 
public class dp2 {//RECURSIVE WAY THEN OPTIMIZE TO DP 
    public static int coins (int [] a, int sum,int i){ 

    if (sum==0) 
     return 1; 
    else if (i==a.length){ 
     return 0; 
    } 
    else if (i>a.length&&sum<a[i]){ 
     return coins(a,sum,i++); 
    } 

    else { 
     return coins(a,sum-a[i],i++)+coins(a,sum-a[i],i); 
    } 
    } 

    public static void main (String [] args){ 
    Scanner sc = new Scanner (System.in); 

    while (sc.hasNext()){ 
     int x = sc.nextInt(); 
     int y=x; 
     int [] a ={1,5,10,25,50}; 
     int w = coins(a,y,0); 
     System.out.println("There are " +w+ " ways to produce "+x + " coins change."); 
    }    
    } 

} 
+1

:-)これはおそらく無限の再帰呼び出しで、あなたがすべき、あなたのコード(あなたの状態をチェック私たちよりも早く問題を見つけてください)。または、再帰呼び出しが多い可能性がありますが、スタックオーバーロードが発生する可能性は低いです。デバッグを使用してコールを追跡する – AxelH

+0

これは無限の再帰呼び出しです。 –

+0

補足としての1つの助言:1行の書式を書式設定する1つの方法に固執する必要があります(混乱を招き、バグを見つけにくいので、常に中括弧を使用することをお勧めします)。私が意味することは、あなたの最初のif-blockが、それに続くelse-if-blockとは対照的であるということです。 – Thomas

答えて

0

あなたは無限ループに問題があります。

最初にチェックしてください、実際には1または0だけを返すことができるので、何を返すのですか。だから、他の条件はどこですか?例:i == a.length - 1または合計<?私は、あなたが合計を返したいと思います。

次に、例17を入力すれば、どこから選択することができますか?

と次、が常にあるので、あなたのコードでは、return coins(a,sum-a[i],++i)+coins(a,sum-a[i],i);を変更してください0

ので、たぶん、あなたのために良いexapleコードです:私はあなたのコードに1文を追加

class dp2 {//RECURSIVE WAY THEN OPTIMIZE TO DP 
    public static int coins (int [] a, int sum,int i){ 
    if (sum==0) 
     return 1; 
    else if (i==a.length){ 
     return 0; 
    }else if(i + 1 == a.length || sum < 0 || sum - a[i] < 0){ //Your break condition ? 
     return sum; 
    } 
    else if (i>a.length&&sum<a[i]){ 
     return coins(a,sum,i++); 
    } 

    else { 
     return coins(a,sum-a[i],++i)+coins(a,sum-a[i],i); 
    } 
    } 
    public static void main (String [] args){ 
    Scanner sc = new Scanner (System.in); 

    while (sc.hasNext()){ 
     int x = sc.nextInt(); 
     int y=x; 
     int [] a ={1,5,10,25,50}; 
     int w = coins(a,y,0); 
     System.out.println("There are " +w+ " ways to produce "+x + " coins change."); 
    } 
    } 
} 
+0

事は私が選ぶであろうどのコインを追跡したいのですか?私はちょうど私が(sum-a [i])を引くときに私がそうすることを基本的に持っている合計を形作るためにこれらのコインを組み合わせることができる方法の数を知りたいです。私が同じコインを2回以上取るか、次のコインに行くか、返すコイン(a、sum-a [i]、i) )+コイン(a、sum-a [i]、++ i); – marwagaser

+0

さて、インクリメントとブレーク条件とで同じ問題が残っています。だから、私は2つのアドバイスを与える:1)増加について、2)休憩条件について:) – MateuszW90

0

、 4行目で:

System.out.println(sum + ", " + i); 

入力27を与え、出力は次の通りであった:

27, 0 
26, 0 
25, 0 
.... decreasing by one each time... 
3, 0 
2, 0 
1, 0 
0, 0 
-4, 1 
-9, 1 
-14, 1 

sum < 0をチェックしていないため、停止しません。

あなたはそこからそれを把握することができるはず... println:世界で最軽量のデバッガ

+0

私のコードには行がある。 else if(i marwagaser

+0

これは終了条件ではありません。 'コイン'への別の呼び出し。再帰関数が実行されてスタックをオーバーフローさせた場合は、最初に終了条件をチェックし、その後に見つかったその他の問題を修正する必要があります。 –

+0

私は、合計が0に達し、i marwagaser

関連する問題