楼主的程序有两处错误,给你修正了一下:
局部两边x没有引用,给你删掉
main函数没有定义类型,加void
#include
void fun(int n)
{
int d,y;//x给你删掉了
d=n%2;
y=n/2;
if(y!=0)
{
fun(y);
}
printf("%d",d);
//putchar('\n');这个没用我给你注释了
}
void main()
{
int n;
printf("enter a number\n");
scanf("%d",&n);
if(n<0)
printf("Input data error\n");
else
fun(n);
putchar('\n')//最后才调用这句代码
}
下面给你分析一下:
fun()函数是一个递归函数,什么意思呢?意思就是它会调用本身,每次函数都会先执行代码d=n%2;y=n/2;然后在判断n是否大于0,如果n大于0,函数继续回调,如果n=0,函数就结束了回调,整个程序也就完成了。
至于你说的执行完了这句还会不会执行后面的printf("%d",d);这是肯定的,因为要输出啊,给你看看运行结果
写递归函数第一个想到的就是递归什么时候结束!
递归调用一层层进入这个你应该是了解了,当y等于0的时候,这个时候也是一层一层的往上返回的,一层一层的输出,二进制的计算本来就是一个先计算后输出的,所以你这样写的顺序是对的。你在纸上写一写没次调用的结果就明白执行顺序了。
/*这是一个讲解递归函数的例子*/
#include
void fun(int num)
{
if(num <= 0)
return; //在这个函数里这个没有用,但要养成这样的习惯。
int d = num % 2;
int y = num /2;
if(y != 0)
{
fun(y);
}
printf("%d", d);
}
int main()
{
int number;
printf("type in a number:");
scanf("%d", &number);
printf("%d 的二进制为: ", number);
fun(number);
printf("\r\n");
return 0;
}
在y!=0的情况下,fun会调用自己,要等y=0后,一层层往上。就到到fun(1)的时候再会执行printf("%d",d);putchar('\n');然后会执行fun(y*2+d)后面的,printf("%d",d);putchar('\n'),然后再往上,,,直到你最初的fun(n)后面的printf("%d",d);putchar('\n')。
你可以在printf("%d",d),后面加一个printf("n = %d\n", n);
可以看到如下结果
8
n = 1
1
n = 2
0
n = 4
0
n = 8
0
执行,那两条语句在void fun(int n)函数的范围内(大括号内),当最后递归出口(y=0)满足时,会从内层到外层依次执行,显示出来的那两条语句最后执行。
肯定执行,if或switch选择结构