我是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;
}
答案 0 :(得分:2)
请考虑以下事项:
while (nextNum > 1)
{
printf("%i", nextNum);
nextNum = x;
break;
}
在这里,x
永远不会改变。因此,nextNum
也永远不会改变。这使循环要么无限期执行,要么根本不执行。
您是想在循环体内调用1}} ,而不是在之外吗?
另请注意,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();