2016-12-04 5 views
-1

Здравствуйте, я пытаюсь выполнить последовательность градиента.
Последовательность градиента в основном: возьмите заданное целое число n - если четное, следующее целое число в последовательности равно n/2, если нечетное, следующее целое число в последовательности равно n * 3 + 1.
API, которому я должен следовать для моего задания требуется, чтобы он выполнялся так же, как и с методом, возвращающим arraylist.
Моя проблема в том, что код просто висит навсегда, когда я добавил вывод в самом методе, чтобы увидеть, что происходит. Я вижу, что он всегда зависает, когда ему почему-то дают номер 10.
Я надеюсь, что здесь есть что-то маленькое, возможно, в моих условиях.Последовательность Hailstone в Java с ArrayList

Вот пример вывода, когда значение 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;} 
     } 

    } 

    } 
+0

Может он висит навсегда, потому что это то, что алгоритм делает на определенном входе? –

+0

Вы прошли через код в своем отладчике IDE? Это место для начала. Пожалуйста, посетите [help] и прочитайте [ask] –

+0

. Какова цель цикла for после вызова 'getHailstoneSequence'? –

ответ

0

В вашем методе for(int i=0; i< results.get(i); i++){ и в главном for(int i=0; i< list.get(i); i++){

Они не пересекают каждый элемент списка или, по крайней мере, не один раз, и в конечном итоге это приведет к выходу за пределы, если вы никогда не добавили его в список.

Скажем, results.get(i) - это 10, и это единственное число в списке ... Затем вы добавляете 5 десять раз, потому что 10 четное, а цикл работает десять раз. Вы, вероятно, добавили 16 5 * 10 раз и т. Д. И т. Д.

Добавление элементов в списки, пока вы их перебираете, как правило, это плохая идея. Вам нужно только отслеживать два числа за раз и добавлять в список отдельно от процесса итерации.


Вот working sample

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; 
+0

Я почти там, это действительно работало, поэтому я больше не застреваю в бесконечном цикле, но независимо от того, какой номер введен, он всегда останавливается на 10 вместо 1: S –

+0

Если вы введете 10, следует добавить 10, 5, 16 , 8, 4, 2,1. Это цикл for в основном методе, который, вероятно, является проблемой - https://ideone.com/iWzlM9 –

 Смежные вопросы

  • Нет связанных вопросов^_^