2016-07-10 22 views
1

出力は正しいものの、ファクタの最後に表示されています(無限ループ)。私は再帰メソッドの内部にwhileループの何かが間違っていることを知っていますが、私はそれが何であるかわかりません。最終的な回答を得た後で再帰呼び出しを停止するにはどうすればよいですか? whileループの代わりに何を使用すればよいですか?再帰的メソッドを使用したファクタの取得

public static void main() { 
    int num; 
    System.out.print("\fInput:"); 
    num = kb.nextInt(); 
    int temp = 1; 
    factors(num, temp); 
} 

public static void factors(int num, int temp) { 
    int count = 2; 

    while (temp != num) { 
     if ((num % count) == 0) { 
      System.out.print(count + " * "); 
      factors(num/count, temp * count); 
     } else 
      count++; 
    } 
} 
+0

あなたが何をしたいか、あなたのコードは何をするのか? – meJustAndrew

+0

私は与えられた数の要因を取得して表示する必要があります。 – wannabe

+0

さて、あなたの答えに実際の例がありますが、これを行う方法はたくさんありますが、特定の解決方法を探していないのであれば、カール氏はこれで十分です。 – meJustAndrew

答えて

1

まず、ここでは再帰は必要ありません。再帰を使用する場合は、すでに大きな値をチェックしていても、常にcount = 2で新規作成を開始します。だから、

、代わりの

factors(num/count, temp*count); 

私はちょうどアッティラはすでに言ったように、あなたは一時パラメータを必要としないし、あなたが必要本当のチェックがnum != 1かどうかで、

num = num/count; 

セカンドを使用します本当です。

実際に再帰を使用する場合は、より良い方法があります。factorsメソッドを渡して、常に2で始める必要はないようにします。この場合、ループは必要ありません。

public static void main() 
{ 
    int num; 
    System.out.print("\fInput:"); 
    num=kb.nextInt(); 
    int count=2; 
    factors(num, count); 

} 



public static void factors(int num, int count) 
{ 
    if (num == 1) 
     return; 

    if((num%count)==0) 
    { 
     System.out.print(count+ " * "); 
     factors(num/count, count); 
    } 
    else 
     factors(num,count+1); 
    } 
} 
+0

パーフェクト!あなたはそれを持って:)すべてのあなたの助けをありがとう:)私はこのコードをトレースし、それがどのように働いて分析します。 – wannabe

0

停止条件(temp!= num)は決してfalseになりません。 最終的な要因が得られたら停止したいので、ファクタ(1、 "元の番号")を呼び出すので、whileループが続くでしょう。

代わりに試してみてください:

while (num != 1) 

とTEMPパラメータは必要ありません。

+0

ありがとう。はい、私は一時変数が役に立たないことに気付きました。 :)私はあなたの試してみました(num!= 1)が、それでも無限ループです。私は本当になぜwhileループがfalseに変わらないのか分かりません。間違ったことは何も見えません。私はまだ再帰メソッドを使用する方法を学んでいます。 – wannabe

+0

すべてのあなたの助けをありがとう:)それを得ました。私は再帰メソッドを使うことでもっと練習します。再びありがとう – wannabe

0

他のが指摘したように、while (temp!=num)falseになることはありませんし、プログラムが無限ループし続けます。 Karl_Costaのソリューションはうまくいきますが、whileループを使用してカウントすることができます。そして、他の人が指摘したように、tempを使う必要はありません。

ここで別の作業溶液 -

public static void main() { 
    int num; 
    System.out.print("\fInput:"); 
    num=kb.nextInt(); 
    System.out.print("1"); // To always print 1 as a factor. 
    factors(num, 2); 
} 

public static void factors(int num, int count) { 
    while(num%count != 0 && num>count) { 
     count++; 
    } 
    System.out.print(" * " + count); 
    if(num==count) { 
     return; 
    } 
    if(num%count==0) 
     factors(num/count, count); 
    else { 
     factors(num/count, count+1); 
    } 
}