【发布时间】:2021-11-26 15:54:29
【问题描述】:
我的代码陷入了无限循环。当前数字减半,当下一个数字为偶数时,该函数应执行 2n+1。如果奇数,它应该执行 3n + 1。一旦执行任何一个操作,它应该再次减半并循环直到 n = 1。这是代码:
#include "stdio.h"
#include "assert.h" // ?
long int hailstone(long int k);
int main(void) {
long int n = 77;
hailstone(n);
return 0;
}
long int hailstone(long int k) {
while (k != 1) {
k = k/2;
if (k % 2 == 0) {
k = 2 * k + 1;
printf("%lu", k);
} else if (k % 2 != 0) {
k = 3 * k + 1;
printf("%lu", k);
} else if (k == 1) {
printf("blue sky!");
}
}
}
特定的断言会帮助编译器按预期执行代码吗?
【问题讨论】:
-
您是否意识到您在
while (k != 1)中有一个if (k == 1)?而且同样的if (k == 1)在else分支中既是偶数又是奇数? -
k在while(k != 1)循环中测试时永远不会是1,而另一个测试if(k == 1)永远不会到达。 -
使用非常基本的 printf 调试(基本上只是查看您的输出)您应该注意到
k在 77 和 38 之间波动。77 除以 2 得到 38。然后计算 2 * 38 + 1 让你回到 77。你的算法有问题。 -
ref 可能会有所帮助。我怀疑“当下一个数字是偶数时,该函数应该执行 2n+1。”不正确。
-
当我注意到我的评论错误地引用了您的代码时,我不得不眨眼:回滚。请不要问流沙问题!
标签: c loops while-loop conditional-statements assert