【问题标题】:Having problems understanding following simple algorithm按照简单的算法理解有问题
【发布时间】:2021-06-26 13:58:01
【问题描述】:
public class Test1
{
    public static void main (String[]args)
    {
        int number = 0;
        for (int i = 0; i < 5; i++)
        {
            if (number != 0)
            {
                number = i * number;
            }
            else
            {
                number = i;
            }
        }
        System.out.println (number);
    }
}

我不太确定这个算法是如何工作的。我的思考过程是:

  1. 我们将number默认设置为0。
  2. 在我们刚才所说的 for 循环中,继续计数 i,直到它不再小于 5。
  3. 我们说如果number 不为0,我们通过将numberi 相乘来更新number。所以在我们的例子中,i 是 0,1,2,3 和 4。
  4. 否则,我们说的数字是 i,而 i 就是我们计算的数字。
  5. 最后,我们打印number

我错过了什么吗?我是不是哪里错了?

如果我运行此代码,为什么会得到 24 作为输出?我无法理解这个简单的程序是如何工作的。

【问题讨论】:

  • 你最终得到4!。在循环中添加System.out.println(number); 可能会有所帮助。
  • 您的想法似乎是正确的。想象一下你是运行这段代码的计算机,想想你会输出什么?
  • 关键是对于所有整数x,0 * x 等于 0,因此如果我们不将 number 初始化为 0 以外的其他值,答案将始终是0。这就是else 分支(即if (number == 0))所做的。我个人会选择另一种方法(用1 初始化number,从i = 1 开始迭代,因为0! is 1)。
  • @Goof 如果您认为您的问题已得到解答,您可以将其中一个答案标记为已接受(投票选项附近的绿色勾号 ✔ 符号)。
  • 糟糕的标题。重写以总结您的具体技术问题。

标签: java algorithm for-loop if-statement


【解决方案1】:
public class Test
{
    public static void main (String[]args)
    {
        int number = 0;
        for (int i = 0; i < 5; i++)
        {
            if (number != 0)
            {
                number = i * number;//For i=2, 3, 4
            }
            else
            {
                number = i;//This is executed twice - for i=0 and i=1
            }
        }
        System.out.println (number);
    }
}

让我们了解一下这个程序。

  1. main() 方法开始执行。
  2. 一个名为number的变量被定义并初始化为0
  3. 定义了一个名为i 的循环控制变量。它的初始值为0,在每次迭代结束时增加1,直到达到5。请注意,i 在循环体内永远不会被修改。
  4. 对于i = 0,条件number != 0false,执行else块。 number = inumber 的值仍然是 0
  5. 对于i = 1,条件number != 0false,执行else块。 number = inumber 的值更改为 1
  6. 对于i = 2,条件number != 0true,执行if 块。 number = i * numbernumber 的值更改为 2
  7. 对于i = 3,条件number != 0true,执行if 块。 number = i * numbernumber 的值更改为 6
  8. 对于i = 4,条件number != 0true,执行if 块。 number = i * numbernumber 的值更改为 24
  9. 由于i = 5,循环中断。打印number 的值。

这就是我们最终得到24 作为输出的方式。

【讨论】:

  • 我建议在发布之前完整地写一个答案。
【解决方案2】:

逐步执行算法将有助于理解它。

让我们从第一行开始。正如你所说,这一行只是将数字设置为 0。

int number = 0;    | number: 0

我在栏后的右侧包含了变量的值。 第二步是从循环开始。在循环开始之前,计数器变量i被设置为零。

int i = 0;    | number: 0, i: 0

作为第二步,我们必须检查是否满足循环条件,以便执行循环体。 循环的条件是i &lt; 5,由于i的当前值为0,0 &lt; 5,循环体被执行:

if (number != 0) {
    number = i * number;
} else {
    number = i;
}

既然是 if 语句,我们必须看看 if 条件是否满足。 number 当前为 0,因此 number != 0 不正确。这意味着我们使用 is:

转到 else 分支
number = i;    | i = 0 -> number = 0

由于i 为零,因此在执行此语句后数字继续为零。 这是循环的第一次执行的结束。循环在重新启动之前所做的最后一件事是增加计数器:

i++;    | number = 0, i = 1

现在i &lt; 5 仍然成立,所以循环体再次运行。 我们仍然有number = 0,因此number != 0 仍然是错误的。 请注意,i 已更新为 1,但 number 直到现在才更新。现在:

number = i;    | i = 1 -> number = 1

现在循环增加计数器并重新开始:

i++;    | i = 2

还是i &lt; 5,所以循环体再次执行。 第一次number != 0 是真的,因为number = 1。 所以现在我们执行:

number = i * number;    | i = 2 -> number = 2

number曾经是1,i是to,所以i * number = 2 循环体再次结束,计数器增加,循环重新开始,因为3 &lt; 5

i++;     | i = 3

这里又是number != 0,所以我们执行

number = i * number;

产生number = 6,因为2 * 3 = 6

i = 4 再次执行相同的过程。 现在number = 4 * 6 = 24。 我们增加计数器

i++;    | i = 5, number = 24

现在i &lt; 5 不再为真,循环退出并

System.out.println(number);

将数字的当前值 24 打印到屏幕上。

【讨论】:

    【解决方案3】:

    您的思考过程很好,但不够准确或不够详细,因为(number 的)乘法序列与i 递增序列的啮合/合并很重要。

    用一张表在纸上算出来,每个变量一列,每条执行的指令一行:

    i      number
    
    null   0     int number = 0; // i has not been initialized yet.
    0      0     int i = 0;
    0      0     number = i;  // it took the else branch
    1      0     i++
    1      1     number = i;
    2      1     i++
    2      2     number = i * number
    3      2     i++
    3      6     number = i * number
    4      6     i++
    4      24    number = i * number
    5      24    i++
    5      24    falls out of loop since i < 5 is now false
    

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 1970-01-01
      • 2010-11-14
      • 2021-08-23
      • 2011-08-11
      • 2017-07-12
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多