这个程序适用于Java。它倾向于做Collatz猜想。在我的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();
}
}
}
答案 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
作为参数传递给ifEven
和ifOdd
。这将删除您当前的错误。另请注意,由于我们不再具有与实例变量同名的方法参数,因此我们不再需要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