Java中的冰雹序列与ArrayList
您好,我正在尝试执行冰雹序列。Java中的冰雹序列与ArrayList,java,collatz,Java,Collatz,您好,我正在尝试执行冰雹序列。 冰雹序列基本上是:取给定的整数n-如果是偶数,序列中的下一个整数是n/2,如果是奇数,序列中的下一个整数是n*3+1。 分配时必须遵循的API要求使用返回arraylist的方法按原样执行分配。 我的问题是代码永远挂起,当我在方法本身中添加输出以查看发生了什么时,由于某种原因,当它被赋予数字10时,代码总是挂起。 我希望在我的情况下,我在这里缺少一些小东西 这里是一些示例输出,当给定n值为15时,它会反复输出 15是奇数,所以我把它设为3n+1:46 46相等,我
冰雹序列基本上是:取给定的整数n-如果是偶数,序列中的下一个整数是n/2,如果是奇数,序列中的下一个整数是n*3+1。
分配时必须遵循的API要求使用返回arraylist的方法按原样执行分配。
我的问题是代码永远挂起,当我在方法本身中添加输出以查看发生了什么时,由于某种原因,当它被赋予数字10时,代码总是挂起。
我希望在我的情况下,我在这里缺少一些小东西 这里是一些示例输出,当给定n值为15时,它会反复输出 15是奇数,所以我把它设为3n+1:46
46相等,我除以2:23
23是奇数,所以我把它设为3n+1:70
70是相等的,所以我除以2:35 35是奇数,所以我把它设为3n+1:106
106是偶数,所以我除以2:53
53是奇数,所以我把它设为3n+1:160
160是偶数,所以我除以2:80
80是相等的,所以我除以2:40
40是相等的,所以我除以2:20
20相等,我除以2:10
15是奇数,所以我把它设为3n+1:46 我的代码
import java.util.ArrayList;
import java.util.Scanner;
public class HailstoneSequence {
public static ArrayList<Integer> getHailstoneSequence(int n){
ArrayList<Integer> results;
results = new ArrayList<Integer>();
results.add(n);
//while the last number is not 1 perform these actions
while((results.size() - 1) != 1){
//for each number in the array
for(int i=0; i< results.get(i); i++){
//test if odd or even
if((results.get(i)%2)==0){
System.out.println(results.get(i)+" is even so I divide by 2: "+ (results.get(i)/2));
results.add((results.get(i)/2));
}
else{
//odd
System.out.println(results.get(i)+" is odd so I make it 3n+1: "+ (3*(results.get(i))+1));
results.add((3*(results.get(i))+1));
}
}
}
return results;
}
public static void main(String[] args) {
int n=0;
Scanner sc = new Scanner(System.in);
System.out.println("Enter the value of n ");
n=sc.nextInt();
sc.close();
//create an initialize new array list to hold results of the hailstonesequence
ArrayList<Integer> list;
list = new ArrayList<Integer>();
list = getHailstoneSequence(n);
//for each number in the array
for(int i=0; i< list.get(i); i++){
if ((list.get(i)!= 1)){
if((list.get(i)%2)==0){
System.out.println(list.get(i)+" is even so I divide by 2: "+ (list.get(i+1)));
}
else{
//odd
System.out.println(list.get(i)+" is odd so I make it 3n+1: "+ (list.get(i+1)));
}
}
else{break;}
}
}
}
import java.util.ArrayList;
导入java.util.Scanner;
公共类冰雹序列{
公共静态数组列表getHailstoneSequence(int n){
ArrayList结果;
结果=新的ArrayList();
结果:添加(n);
//当最后一个数字不是1时,执行这些操作
而((results.size()-1)!=1){
//对于数组中的每个数字
for(int i=0;i
在方法中for(int i=0;i
和mainfor(int i=0;i
这些不会在列表的每个元素上循环,或者至少不会循环一次,如果您从未添加到列表中,最终会导致超出范围
假设results.get(i)
是10,这是列表中唯一的数字…然后添加5个10次,因为10是偶数,循环运行了10次。然后可能添加16个5*10次,以此类推
在迭代时向列表中添加元素通常是个坏主意。一次只需跟踪两个数字,就可以在迭代过程中单独添加到列表中
这里有一个
ArrayList结果=新建ArrayList();
结果:添加(n);
如果(n==1)返回结果;
int-next;
如果(n%2==0)next=n/2;
else next=3*n+1;
结果。添加(下一步);
while(下一步!=1){
如果(下一个%2==0)下一个=next/2;
else next=3*next+1;
结果。添加(下一步);
}
返回结果;
可能它会永远挂起,因为这就是算法在某些输入上所做的工作?您是否在IDE调试器中仔细检查了代码?这是开始的地方。请访问,并在调用getHailstoneSequence
后阅读for循环的目的?我就快到了,这确实有效,因此我不再被困在inf中inity循环但无论输入什么数字,它总是在10而不是1时停止:如果输入10,则应添加10、5、16、8、4、2、1。主要方法中的for循环可能是问题所在--
ArrayList<Integer> results = new ArrayList<Integer>();
results.add(n);
if (n == 1) return results;
int next;
if (n % 2 == 0) next = n / 2;
else next = 3*n + 1;
results.add(next);
while (next != 1) {
if (next % 2 == 0) next = next / 2;
else next = 3*next + 1;
results.add(next);
}
return results;