【问题标题】:Nested while loops stop after first iteration?嵌套的while循环在第一次迭代后停止?
【发布时间】:2013-09-16 20:11:04
【问题描述】:

我正在尝试使用表格“魅力”比较值,但我的外部 3 个循环只会注册第一次迭代;只有最里面的循环比较所有值。

while (m < 17) {
        while (n < 17) {
            while (o < 17) {
                while (p < 17) {
                    number = (Math.pow(w, charms[m]))
                            * (Math.pow(x, charms[n]))
                            * (Math.pow(y, charms[o]))
                            * (Math.pow(z, charms[p]));
                    if (Math.abs(cons - number) < Math.abs(cons - closest)) {
                        closest = number;
                        a = charms[m];
                        b = charms[n];
                        c = charms[o];
                        d = charms[p];
                    }
                    p++;
                }
                o++;
            }
            n++;
        }
        m++;
    }

【问题讨论】:

  • 您采取了哪些诊断步骤? mnop 的初始值是多少?有例外吗?基本上这里的信息太少,无法帮助您。
  • 您不应该将其更改为封装所有这些值的 while 循环吗?我的意思是(m
  • p==17 时,它永远不会重置为它拥有的任何初始值。第一次运行后,外部循环无用。
  • 使用for循环重写它,你会更容易看到逻辑。

标签: java loops while-loop nested


【解决方案1】:

首先,你没有展示你如何初始化m, n, o and p。其次,您不会在任何时候重置计数器。一旦你通过了最内层循环一次,你将永远不会再通过它,因为之后p 将大于或等于 17。然后一旦o 达到 17,您将永远不会再进入该循环等等。

【讨论】:

  • 谢谢你,我不敢相信我忘了做这么简单的事情。
  • @user2785277 我已经编程了 36 年,但有时我仍然会这样做。事实上,上周我发现了一个我忘记在 while 循环中增加一些东西的地方。
【解决方案2】:

了解mnop 的初始值是什么以及charms 的值是什么会很有帮助。但是这不起作用有一个简单的原因:比如mnop 在循环之前都设置为 1。然后当p 为17 时,内部循环执行并退出。然后你增加o 并重新开始循环——但是p 是什么?还是17岁!它永远不会回到 1 或其他任何值。因此,最内层循环中的任何代码都不会再次执行。

至少,您需要在循环之前重置每个变量:

 while (m < 17) {
    n = 1;  // or whatever, you haven't told us what it's supposed to start at
    while (n < 17) {
        o = 1;
        while (o < 17) {
            p = 1;
            while (p < 17) {

或者更好的是,使用 for 循环将初始化、测试和递增逻辑放在一个地方。

【讨论】:

    最近更新 更多