如何在简单的C ++函数中修复无限循环?

时间:2017-02-12 18:55:19

标签: c++ infinite-loop

我是C ++的初学者,代码是作业的一部分。我对程序无限循环有问题。我知道无限循环发生在序列(n)中,但我不明白为什么它是无限循环。我已经逐步评估了这个过程,但我似乎错过了一些东西。

Ex:我遇到的问题:n = 7,序列打印:7 22 22 22 22 22

#include <cstdio>
using namespace std;

// next(n) returns the value that follows n in the hailstone sequence.
// Example: next(7) = 22, next(22) = 11, etc.
// Since the hailstone sequence ends at 1, n is required to be > 1.

int next (int n)
{
  while (n > 1)
  {
    if (n%2 == 0)
    {
      return n/2;
    }
    else
    {
      return 3*n+1;
    }
  }
  return 1;
}

// sequence(n) executes next(n) in a loop to print the next integer(s)
// in the hailstorm sequence, starting from n until ending with 1.

void sequence(int n)
{
  int nextNum = n, x = next(nextNum);
  while (nextNum > 1)
  {
    printf("%i", nextNum);
    nextNum = x;
    break;
  }
  if (nextNum == 1)
  {
    printf("%i", 1);
  }
}

int main()
{
  int n;
  printf("Enter n: ");
  scanf("%i", &n);

  sequence(n);

  return 0;
}

3 个答案:

答案 0 :(得分:2)

请考虑以下事项:

while (nextNum > 1)
{
  printf("%i", nextNum);
  nextNum = x;
  break;
}

在这里,x永远不会改变。因此,nextNum也永远不会改变。这使循环要么无限期执行,要么根本不执行。

您是想在循环体内调用,而不是之外吗?

另请注意,next()中的while (n > 1)是无操作的,因为循环体始终为next()

答案 1 :(得分:0)

首先,@ NPE建议while循环中 nextNum 的值没有变化。您可以直接指定nextNum的值,而无需使用变量x。

第二件事是你为什么在循环中使用 break 语句。  您可以写如下: -

while (nextNum > 1)
 {
   printf("%i", nextNum);
   nextNum = next(nextNum);
 } 

现在 nextNum 会在循环的每次迭代中都有新值。 希望这会帮助你。 : - )

答案 2 :(得分:-1)

您实际上可以使用此代码生成冰雹序列。

//panel.new DataGenerator(1000).start();
timer = panel.new DataGenerator(1000);
timer.start();