所以,首先我是C的初学者,我们正在大学学习“结构化编程”课程。
现在,关于“递归函数”的最后几个讲座对我来说是个初学者的痛苦。你们中的任何人都可以这样解释我:
所以我有这个小脚本,一个带十进制数的递归函数,并将其转换为二进制数:
#include <stdio.h>
void binary(int num)
{
if (num == 0) return;
binary(num / 2);
printf("%d", num % 2);
}
int main()
{
int n;
scanf("%d", &n);
binary(n);
return 0;
}
现在我想知道,这个功能如何运作?我知道它背后的逻辑,它应该做什么,但我不知道它是如何做到的。底部的printf特别让我失望,例如,如果printf函数在递归调用之前,输入十进制数10就打印出来(0101),但如果它在它下面打印出正确的二进制数(1010)?
非常感谢任何形式的帮助,亲切的问候。
答案 0 :(得分:1)
使用函数的调用堆栈完成反转。我的意思是调用函数的方式,这保证MSB
将首先打印,然后打印下一个,依此类推。
void binary(int num)
{
if (num == 0) return;
binary(num / 2); // Wait, I will print but you first print the MSB's.
printf("%d", num % 2); // Now I print the last digit.
}
向下运动会移动呼叫。
{binary(12)
{binary(6)
{binary(3)
{binary(1)
binary(0) -- returns
Now we print 1
}
print 1
}
prints 0
}
prints 0
}
答案 1 :(得分:1)
如果想要递归打印带有前导零的字符的位, 他可以使用以下代码:
#include <stdio.h>
void print_bit_iter(char x, int n)
{
int bit = (x & (1 << n - 1)) != 0;
printf("%d", bit);
if(n != 0)
print_bit_iter(x, n - 1);
}
int main()
{
print_bit_iter('U', 8);
}
这将有
01010101
作为输出。