【发布时间】:2017-06-26 01:15:24
【问题描述】:
我一直在寻找一个简单的十进制到二进制转换程序,然后,我遇到了以下使用递归的程序。
void bin(unsigned n)
{
/* step 1 */
if (n > 1)
bin(n/2);
/* step 2 */
printf("%d", n % 2);
}
int main(void)
{
bin(4);
return 0;
}
正如预期的那样,这个程序的输出是100。但是,我无法理解它如何显示输出100,因为根据我的说法,输出应该是1(不正确)而不是100。
这是我对bin函数步骤的解释。
- 我们会将
4作为bin的参数放在首位。 -
4 > 1,因此,它将再次使用参数 2 调用bin函数。 - 现在,
2 > 1,因此,它将再次使用参数 1 调用bin函数。 - 由于
1不大于1,我们将转到步骤2,编译器将打印1(因为1%2=1),因此,这个程序应该只打印1而不是100。
谁能解释并指导我哪里错了?
【问题讨论】:
-
使用您的 调试器 并单步执行程序。您将很快了解为什么以及何时打印零。
-
程序使用递归逻辑。请通过递归了解更多详细信息。
-
这个sn-p中唯一的十进制是
printf("%d", n % 2);(应该是printf("%u", n % 2);,顺便说一句) -
@wildplasser,
n%2是二进制的0000...01或0000..00所以%u是不必要的。 -
该用户明确表明他试图这样做,为什么要投反对票,他正在努力学习和尝试。