2017-02-27 5 views
-4

このプログラムはJava用です。それはCollat​​zの推測をするために訴えられました。私のmingでコードはうまくいくはずですが、7を入力すると22の束が印刷されます。javaはintを正しく保存しません

import java.util.*; 
//If n is even, divide it by 2 to get n/2. If n is odd, multiply it by 3 . and add 1 
public class infNum { 
    private int num; 
    private int n; 
    private String comma = ", "; 

    public void start() { 
     System.out.println("enter a number"); 
     Scanner keyboard = new Scanner (System.in); 
     int n = keyboard.nextInt(); 
     num = n; 
    } 
    public void testEvenOdd() { 
     if((num % 2) == 0) { 
      ifEven(num); 
     } else { 
     ifOdd(num); 
     } 
    } 

    public void ifEven(int num) { 
     if(num == 1) { 
     return; 
     } else { 
     num = num/2; 
     System.out.print(num + comma); 
     testEvenOdd(); 
     } 
    } 

    public void ifOdd(int num) { 
     if(num == 1) { 
     return; 
     } else { 
     num = (num * 3) +1; 
     System.out.print(num + comma); 
     testEvenOdd(); 
     } 
    } 
} 
+1

まあ、「7」は奇数です。 '7 * 3'は21、' 21 + 1' **は** '22'です。あなたのプログラムが、あなたが言ったこととまったく同じように見えます。 –

+0

これはどうですか?開始メソッドはどこですか?開始の場合、ほかのメソッドは呼び出されません。 –

+0

あなたの 'testEvenOdd'メソッドが' num'インスタンス変数をチェックし、他のメソッドが決してそれを更新しないという問題がさらにあります。現在は、独自のパラメータのみを更新します。パラメータは、メソッドの終了時に範囲外になります。 – azurefrog

答えて

1

コードは動作するはずですが、私は7を入力するときには、java保存int型で、私はその問題を考える 22年代の束を出力します。

問題は、インスタンス変数をローカル変数i.eと混合してインスタンス変数を更新したいのではなく、ローカル変数を更新しているようです。これは簡単に解決できます。thisキーワードを使用して区別してください。

例:

import java.util.*; 
    //If n is even, divide it by 2 to get n/2. If n is odd, multiply it by 3 . and add 1 
    public class infNum { 
     private int num; 
     private int n; 
     private String comma = ", "; 

    public void start() { 
     System.out.println("enter a number"); 
     Scanner keyboard = new Scanner (System.in); 
     int n = keyboard.nextInt(); 
     this.num = n; 
    } 
    public void testEvenOdd() { 
     if((this.num % 2) == 0) { 
      ifEven(this.num); 
     } else { 
     ifOdd(this.num); 
     } 
    } 

    public void ifEven() { 
     if(this.num == 1) { 
     return; 
     } else { 
     this.num = this.num/2; 
     System.out.print(this.num + comma); 
     testEvenOdd(); 
     } 
    } 

    public void ifOdd() { 
     if(this.num == 1) { 
     return; 
     } else { 
     this.num = (this.num * 3) +1; 
     System.out.print(this.num + comma); 
     testEvenOdd(); 
     } 
    } 
} 

UPDATE

インスタンス変数が使用されているので、ifEvenifOddにパラメータとしてnumを渡す必要がないので、私はあなたのメソッドのパラメータを更新しました。これにより、現在行っているエラーが削除されます。また、インスタンス変数と同じ名前のメソッドパラメータが存在しないため、thisキーワードはもう必要ありません。しかし、私は良い練習のためにそこに残しました。

+0

魔法使いを演じて、なぜそれらのメソッドに 'int num'を渡すのですか? –

+0

@OusmaneDiawインスタンス変数が使用されているので、 'ifEven'と' ifOdd'にパラメータとして 'num'を渡す必要はありません(これはElliottが言っていると思います) – BackSlash

+0

@BackSlash正しいところ私は彼がどこにいるのかを見ています。私はその提案に対応するために私の答えを更新すべきです。 –

0

入力が7の場合、22が正しい出力です!

testEvenOdd()はelse文(ifOdd(7))に行きます。ここでは、7は1ではないので、(7 * 3)+ 1 = 22を印刷しています。次に、testEvenOdd()をもう一度呼び出しています!したがって、ifOdd(7)に行き、22を出力し、testEvenOdd()をもう一度呼び出すことになります。メモリを使い切るまで無期限に繰り返す可能性が最も高いです。

0

どのような順序でこれらのメソッドを呼び出していますか?私つもりは(7 % 2が1であるため)if((num % 2) == 0)はfalseになりますtestEvenOddメソッドの内部で、あなたは7を入力する場合は、start()、その後testEvenOdd()

を呼び出していると仮定しています。 - * 3(7の>結果num = (num * 3) +1、そうnumは22になります。だから、numが7であるとして、if(num == 1)はfalseになりますと、それはelse句を呼ぶことにします、ifOddメソッド内法ifOdd()

と呼ぶことにします)+ 1

関連する問題