序列中的递归

时间:2013-01-22 22:40:31

标签: java loops integer

我正在尝试使我的Hailstone序列输出由于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 ++;
        }
    }

2 个答案:

答案 0 :(得分:4)

看看你实际在做什么。您的print语句位于条件为x < 0的if语句中,但x 从不小于0。您在x上执行的两项操作是: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),如另一个答案中所示。我只是为了完整起见而提到它。

答案 1 :(得分:2)

目前,您的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,那么在某个时间点,1会因if条件而成为x = 1

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


为了完成答案,我认为你甚至不需要最后的条件 - x becomes 1。您的while循环将在1时自动中断。这必须是结束序列的唯一条件。因为,一旦从值if (x < 0)开始,你就会陷入那种致命的序列。所以,只需删除if (x % 2 == 0) x = x / 2; else x = x * 3 + 1; 部分即可。 不需要。

所以,你应该使用: -

inner

在你的{{1}}中。