为什么这个循环没有终止?

Dav*_*vid 3 java recursion collatz

这是示例代码:

public static void col (int n) 
{
    if (n % 2 == 0) 
       n = n/2 ; 
    if (n % 2 != 0) 
       n = ((n*3)+1) ;

    System.out.println (n) ;
    if (n != 1) 
       col (n) ;
}
Run Code Online (Sandbox Code Playgroud)

这个工作正常,直到它下降到2.然后它2 4 2 4 2 4 2 4 2 4无限输出.在我看来,如果输入2为n则为2,则将2 (n % 2 == 0)除以2,然后将打印1,因为(n != 1)为假,循环将终止.

为什么不这样呢?

Igb*_*man 13

因为当你到达1时,你将乘以3并加1,再将你带回4.

你需要一个ELSE.我不知道java,但它看起来像:

public static void col (int n) 
{
    if (n % 2 == 0) 
      n = n/2 ; 
    else if (n % 2 != 0) 
      n = ((n*3)+1) ;

    System.out.println (n) ;
    if (n != 1) 
      col (n) ;
}
Run Code Online (Sandbox Code Playgroud)

编辑:如评论中所述,您可以在else之后省略if测试:

if (n % 2 == 0) 
  n = n/2 ; 
else 
  n = ((n*3)+1) ;
Run Code Online (Sandbox Code Playgroud)

  • 你可以说'else`,因为`else if`中的条件保证是真的.但除此之外,尽管显然不了解Java,但你做得很好.:-) (5认同)