私はC++の初心者です。コードは割り当ての一部です。プログラムの無限ループに問題があります。私は無限ループがシーケンス(n)で発生することを知っていますが、なぜ無限ループであるのか分かりません。私はプロセスを段階的に評価しましたが、何かが欠けているようです。シンプルなC++関数で無限ループを修正するには?
例: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;
}
その行はnextNum = next(nextNum)と等しくなければなりません。next()は値を返すときにnextNumがどのように変化しないのでしょうか? –
@MTee *それは*ではありません。 'x = next(nextNum)'を宣言に置き、 'x'の* initialization *がどこでも' x'が出現することを意味するわけではないので、これは式next(nextNum)を代入することと等価です。 'x'はプリプロセッサマクロではありません。それは変数です。 – WhozCraig
ああこれは素晴らしい洞察です。 'while ='文のすぐ上にある 'x = next(nextNum);という行は、「xを参照してxをnext(nextNum)にしたいとき」を意味するかもしれないと思うかもしれませんが、そうではありません!単に 'next(nextNum)'の値で 'x'を初期化すると言うだけです。その時点から、 'x'はあなたが何か他のものに変更しない限り、あなたが最初に初期化した値になります。重要なのは、 '='は**平等の意味ではなく**、**の割り当てを意味します。 – rwols