java没有正确保存ints

时间:2017-02-27 23:00:49

标签: java

这个程序适用于Java。它倾向于做Collat​​z猜想。在我的ming代码应该工作,但当我输入7它打印出一堆22 #s我认为这是一个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();
      }
   }
}

3 个答案:

答案 0 :(得分:1)

  

代码应该可以工作,但当我输入7时,它打印出一堆   22我认为这是java保存整数的问题。

问题似乎是您要将实例变量与要更新实例变量的局部变量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();
      }
   }
}

<强>更新

我更新了您的方法参数,因为使用了实例变量,因此无需将num作为参数传递给ifEvenifOdd。这将删除您当前的错误。另请注意,由于我们不再具有与实例变量同名的方法参数,因此我们不再需要this关键字。但是,我把他们留在那里是为了良好的做法。

答案 1 :(得分:0)

如果你的输入是7,22是正确的输出!

testEvenOdd()转到else语句,即ifOdd(7)。这里,由于7不是1,你打印(7 * 3)+ 1 = 22.然后你再次调用testEvenOdd()!因此,它将转到ifOdd(7),打印出22,并再次调用testEvenOdd()。在你耗尽记忆之前,它很可能无限期地重复。

答案 2 :(得分:0)

您按哪种顺序调用这些方法?我会假设您正在呼叫start()然后testEvenOdd()

如果输入7,则在方法testEvenOdd内,if((num % 2) == 0)将为false(因为7 % 2为1)。所以它会调用方法ifOdd()

ifOdd方法内,由于num为7,if(num == 1)将为false,并且会调用else子句:num = (num * 3) +1,所以{ {1}}将是22 - &gt; (7 * 3)+ 1

的结果