【问题标题】:Nested For loop eternally running?嵌套的 For 循环永远运行?
【发布时间】:2020-03-22 18:53:39
【问题描述】:

在这里找出嵌套的 for 循环有点麻烦。问题来了:

  1. 爱尔兰的人口为 480 万,并且以每年 7% 的速度增长。编写程序来确定和显示人口 在 10 年的时间里。您的程序还应该显示 预计人口将超过 500 万的年数。

这是我迄今为止编写的代码:

    double pop = 4.8;
    int years = 0;
    for (int i = 0; i < 10; i++)
    {
        pop += (pop / 100) * 7;

        for (int j = 0; pop >5; j++)
        {
            years += j;
        }
    }

    Console.WriteLine("Pop in year 2030 is " + Math.Round(pop, 2) + " million and the population will be over 5 million for " + years + " years.");
}

现在要清楚,我需要人口超过 5(百万)年的总和(答案是 10),我必须只使用 for 循环来解决这个问题。我认为答案是嵌套的 for 循环,但尝试并没有成功。

谁能帮我看看我把这件事搞砸了?

【问题讨论】:

  • 请发布问题,而不是截图链接。
  • 内部 for 循环是无限的(“永恒的”),因为 pop 在它内部从未改变过。始终在问题发布对问题至关重要的信息,而不是作为链接。让人们可以轻松地为您提供帮助,并使问题对未来的用户具有一定的价值。
  • 准备一张纸、一支钢笔(或铅笔)和一个计算器,然后逐步执行您的代码。当i 等于 0(零)时,pop = ?。当i 等于 1(一)时,pop = ? 以此类推。之后,您只需计算pop 超过 5 的次数,对吗?顺便说一句,pop * 0.07 也计算了pop 的 7%。
  • 在编程中学习的第一个也是最重要的技能之一是how to debug

标签: c# for-loop nested


【解决方案1】:

看看你的内循环。

    for (int j = 0; pop >5; j++)
    {
        years += j;
    }

你的条件是pop &gt; 5,如果你想退出循环,你需要pop 收缩。但是循环体永远不会改变pop,所以如果它大于 5,你将永远循环。

问题定义表明您根本不需要内部循环。只需检查pop,如果大于5,则增加years

    if (pop > 5)
    {
         ++years;
    }

如果您真的受到无法使用if 的疯狂限制,您可以做一些愚蠢的事情,例如创建一个for 循环,如果您的其他条件正确,该循环只会运行一次。

    for (int j = 0; j < 1 && pop > 5; ++j)
    {
        ++years;
    }

但没有理智的人会这样做。

【讨论】:

  • 这种情况下if语句的解法显然是正确的,可惜这个练习只需要for循环来解,已经被迷惑了!不过感谢您的帮助
  • @BenLawlor:已更新。这是一个非常奇怪的限制,但肯定不是不可能的。 :)
【解决方案2】:

首先,在我看来,您需要更清晰的变量名称。当然,不要走得太远,但 IMO population 会比 pop 更好。

此外,您可以使用 Dictionary 将年份与预测的人口一起存储。

另外,写 cmets 以更好地了解发生了什么:)

有了这些建议,我将编写如下代码:

double population = 4.8;
int currentYear = 2020;
Dictionary<int, double> predictions = new Dictionary<int, double>();
// Adding current state
predictions.Add(currentYear, population);

// I changed bounds of a loop to handle years in more comfortable way :)
for (int i = 1; i <= 10; i++)
{
  population *= 1.07;
  predictions.Add(currentYear + i, population);
}

现在Dictionary 中的数据如下所示:

2020  4.8
2021  ...
2022  ...
...   ...

现在您可以通过predictions.Where(kvp =&gt; kvp.Value &gt; 5) 轻松获取人口超过 500 万的所有年份。

【讨论】:

    【解决方案3】:

    如果我很好理解你的问题。 从技术上讲,如果你每年增加 7%,你的程序应该是这样的

    bool passed = true;
    double pop = 4.8;
    int year = 0;
    for (int i=0; i<10; i++)
    {
     pop *= 1.07;
    if (pop > 5 && passed)
    {
     year = i;
     passed = false;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2016-11-15
      • 2018-07-24
      • 1970-01-01
      相关资源
      最近更新 更多