Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的冰雹序列与ArrayList_Java_Collatz - Fatal编程技术网

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
和main
for(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;