序列递归



我正在尝试使我的冰雹序列输出为由于对 int 的限制而无法计算的最小整数,但由于某种原因它仍然不起作用。任何关于为什么不的想法将不胜感激。

    public static void main(String[] args) {
        int x=2; 
        int count = x;
        //Collatz Conjecture computation
        while (true)
        {   x=2; 
            x =count;
            while (x != 1)
            {   
                if (x % 2 == 0)
                    x = x / 2;
                if (x % 2 == 1)
                    x = x * 3 + 1;
                if (x < 0)
                {   System.out.print("The integer " + count + " cannot have its Hailstone sequence computed using int variables. ");
                    return;
                }
            }
            count ++;
        }
    }

看看你到底在做什么。您的打印语句位于条件为 x < 0 的 if 语句中,但x永远不会小于 0x上执行的两个操作是:x = x / 2x = x * 3 + 1。这些都不能将积极因素变成消极因素。


编辑: 现在我明白x < 0是为了测试int溢出。请记住,不能保证会发生这种情况,序列可能会陷入一个循环(对于大多数初始x可能会,因为一旦序列达到1,您将有这样的循环),尽管如果发生这种情况,您的while循环将中断并且您将无法获得输出。另一种选择(正如我在评论中指出的那样)是x属于long类型(即 long x = ... ),并让 if 条件x > Integer.MAX_VALUE


另外,看看这个:

int n = Integer.MAX_VALUE;
System.out.println(3 * n + 1);
2147483646

显然存在溢出,但3*n + 1的结果仍然是积极的。


最后,您的前两个if语句似乎存在问题(第二个应该是else if),如另一个答案所示。我只是为了完整起见而提到它。

目前,您的Hailstone sequence将达到无休止的4, 2, 1, 4, 2, 1, ...序列,因为您有多个if's而不是if-else

您应该将if's集更改为:-

if (x % 2 == 0)
    x = x / 2;
else
    x = x * 3 + 1;
if (x < 0) {   
    System.out.print("The integer " + count + " cannot have its Hailstone sequence computed using int variables. ");
    return;
}

那么,问题出在哪里?

如果您只使用 if's ,那么在某个时间点,您的x将由于第一个if条件而变得1

因此,使用 x = 1 ,将执行第 2 个ifx现在将变为 - 1 * 3 + 1 = 4 。然后 while 循环继续。同样,x变得2第 1 if 次),然后再次while循环继续(因为2nd if现在不满意。 2 % 2 != 1 ),然后x变为1第 1 if),然后变为4第 2 if ),依此类推。出现此问题是因为您的两个if块每次都会被执行。


只是为了完成答案,我认为你甚至不需要最后一个条件 - x < 0.您的 while 循环将在x becomes 1时自动中断。而这一定是结束序列的唯一条件。因为,一旦你从价值1开始,你最终会陷入那个致命的序列。因此,只需删除if (x < 0)部分即可。 不需要

因此,您应该只使用: -

if (x % 2 == 0)
    x = x / 2;
else
    x = x * 3 + 1;

在你的inner一会儿。

相关内容

  • 没有找到相关文章

最新更新