重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在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')。
创新互联-专业网站定制、快速模板网站建设、高性价比崇州网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式崇州网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖崇州地区。费用合理售后完善,十多年实体公司更值得信赖。
你可以在printf("%d",d),后面加一个printf("n
=
%d\n",
n);
可以看到如下结果
8
n
=
1
1
n
=
2
n
=
4
n
=
8
楼主的程序有两处错误,给你修正了一下:
局部两边x没有引用,给你删掉
main函数没有定义类型,加void
#include stdio.h
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(n0)
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);这是肯定的,因为要输出啊,给你看看运行结果
因为递归在输出语句之前,所以,最后一次递归的值在最先输出。
执行顺序为:
这是数组a[10]
dis(a[i]);//初始为啊0,就是a[0],然后在函数内部调用dis(a[i+1]),就是a[1],然后递增到数组结束
dis(a[i]) //i=0;
dis(a[i]+1)//i=0+1
dis(a[i]+1)//i=1,i+1=1+1=2.............
是第一个执行完再执行第二个
递归调用可以这样理解,就是想像有很多个函数的复制体,每次调用自己都是在调用一个复制体,一直到满足
if(start=end)
return;
然后再一层一层返回。