Collat​​z猜想方法 - Java

时间:2016-08-13 01:48:51

标签: java methods collatz

我只是学习在Java中使用方法。我正在尝试使用一种方法来输出使用collat​​z猜想获得1所需的步骤数。任何人都可以帮助我更好地了解如何执行该方法?这就是我到目前为止所做的:

public static void main(String[] args) {
  collatz();     
}

public static void collatz(int n) {
  n = 20;
  int i = 0;
  if (n == 1) {         
  } else if (n % 2 == 0) {
      n = (n / 2);

  } else {
     n = (3 * n + 1);

  }
  i++;
System.out.println(i);  
}

3 个答案:

答案 0 :(得分:1)

这将不起作用,因为仅在代码末尾更改“ i”,并且您没有在代码中使用递归或任何形式的循环。因此,即使编译了,也不会给出正确的答案。

这是我为您完成的递归方法。

public class Cycle {
    static int cycle2 (int num) {
        if (num == 1) {
            return 0;
        } else {
            if (num % 2 > 0) {
                return 1 + cycle2(num * 3 + 1);
            } else {
                return 1 + cycle2(num / 2);
            }
        }

    }
    public static void main(String[] args) {
        int num = 14;
        System.out.println(cycle2(num));
    }
}

答案 1 :(得分:1)

我知道很久以前就问过这个问题,我也遇到过类似的问题,所以这是我的解决方案:

public class Collatz {
   public static void main(String[] args) {
       collatz(); 
     }

  /*If you have (int n) inside method then 
  when you are calling collatz() you need to have
  value inside parentheses-collatz(20), or do simply like I did. 
  Also you need while loop! It will loop n (20) untill finaly get 1. 
  Otherwise your code will execute only once 
  and you will have as a result 1 step to complete instead of 7*/

   private static void collatz() {  
       int n = 20;                                             
       int i = 0;
       while (n != 1) {

         if (n % 2 == 0) {
           n = (n / 2);
         } else {
         n = (3 * n + 1);
         }
        i++;

       }
    System.out.println(i);
   }
}

答案 2 :(得分:0)

据我所知,你在询问语法(而不是算法本身),所以这里是上面的另一个版本:

public static void main(String[] args) {
  // collatz has to be called with a value or it won't compile
  collatz(20);
}

public static void collatz(int n) {
  int i = 0;
  // The following has to occur inside a loop or it'll only occur once
  while (n > 1)
  {
     // The following is what's known as "ternary form" - if the first statement is true, it'll assign the first value. Otherwise it assigns the first value.
     // For example,
     // int a = (1 == 2 ? 10 : 20);
     // will equal 20
     n = (n % 2 == 0 ?
            (n / 2) : // This value will be assigned if n is even
            (3 * n + 1)); // This value will be assigned if n is odd
     i++;
   }
  System.out.println(i);  
}