【问题标题】:Recursion in sequences序列中的递归
【发布时间】:2013-01-22 22:40:30
【问题描述】:

我正在尝试使我的 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 ++;
        }
    }

【问题讨论】:

  • 到底是怎么回事?
  • 当我运行程序时它没有输出任何东西。即使我将它设置为一旦找到就输出该整数值。
  • 拿出笔和纸,像计算机一样逐步完成程序。写下每个变量和分配给它们的值。 x 是否小于 0?
  • 当出现溢出错误时,它从 int 限制的负整数范围开始。

标签: java loops integer


【解决方案1】:

看看你实际在做什么。您的打印语句位于条件为x &lt; 0 的if 语句中,但x永远不会小于0。您对x 执行的两个操作是:x = x / 2x = x * 3 + 1。这些都不能把积极变成消极。


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


另外,看看这个:

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

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


最后,你的前两个if-statements 似乎有问题(第二个应该是else if),如另一个答案所示。为了完整起见,我只是提到它。

【讨论】:

  • 我将其设置为 0,因为它会导致溢出错误,将其抛出负整数范围。那么还有什么其他可行的解决方案呢?
  • @user1860709 哦,我明白了,如何使用long,然后检查是否x &gt; Integer.MAX_VALUE
  • 我刚刚尝试过,但我仍然没有得到任何输出。我将 x 更改为 long 然后设置 if (x &gt; Integer.MAX_VALUE) 但仍然没有输出
  • 我将我的初始 x 设置为 long x = 2 并将 if 语句设置为 MAX_VALUE 但仍然没有。
【解决方案2】:

目前,您的Hailstone sequence 将达到4, 2, 1, 4, 2, 1, ... 中的unending sequence,因为您拥有多个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,那么在某个时间点,由于第一个if 条件,您的x 将变为1

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


只是为了完成答案,我认为您甚至不需要最后一个条件 - x &lt; 0。当x becomes 1 时,您的 while 循环将自动中断。这必须是结束序列的唯一条件。因为,一旦你从值1 开始,你就会进入那个致命的序列。因此,只需删除 if (x &lt; 0) 部分。 不需要。

所以,你应该只使用:-

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

在您的inner 中。

【讨论】:

  • @A.R.S.是的,但是如果 x 在除法后变为 1,如果您使用 if 而不是 else if,下一步会立即将其再次推高到 4....
  • 哦,是的,我的错,忽略我之前的评论。
  • 谢谢!我看到了我愚蠢的错误,应该早点发现。感谢您的所有帮助。
  • +1 但我仍然会远离x &lt; 0,请参阅我回答的最后部分。
  • @user1860709。请注意,在乘法运算的情况下永远不会发生溢出。所以,你的x &lt; 0 永远不会是真的。可能你还需要修改它。
猜你喜欢
  • 2016-05-18
  • 2014-07-26
  • 2023-03-22
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多