#include<stdio.h>fun(int x){if(x/2>0) fun(x/2);printf("%d",x);}main(){fun(6);prin

发布时间:2019-09-16 00:40:15

#include<stdio.h>fun(int x){if(x/2>0) fun(x/2);printf("%d",x);}main(){fun(6);printf("\n");}答案和详细解释

推荐回答

这是一个递归调用函数的例子,fun(int x){ if(x/2>0)   fun(x/2); printf("%d",x);}子程序的功能是:对传入的参数X进行判断,当X/2>0的时候,执行fun(x/2);否则,执行printf("%d",x);eg.令x=6,则,fun(6),首先执行判断if(6/2>0) ,显然,它大于零(6/2=3),所以,执行fun(3),继续判断,3/2=1,直到1/2<0,开始执行printf("%d",x=1);接着,函数返回到上一次的状态,即fun(3),再执行一次printf("%d",x=3);,然后,函数返回到fun(6)的状态,执行printf("%d",x=6);,所以,结果是:136这个问题可以这样来看待,本来fun(6)是需要执行printf("%d",x=6);的,但由于之前有判断语句,所以,先执行判断语句,并符合判断条件,于是,在执行printf("%d",x=6);之前,先执行fun(3),而又是一个函数,所以,先执行fun(3),完了再执行printf("%d",x=6);但在执行fun(3)的printf("%d",x=3);的时候,又出现fun(1)需要先执行,于是,先执行fun(1),这次,判断条件不通过,直接执行printf("%d",x=1);,执行完了后,接着去执行刚才fun(3)中未执行完的printf("%d",x=3);,以此类推,直到printf("%d",x=6);执行完毕后,所有的语句都按照要求执行完了。至此,程序也就结束了。递归调用的实质是中断,也就是将需要执行的指令地址先用栈保存,再去执行被调用函数,当被调用函数执行完毕后,将之前保存的指令地址弹栈,继续执行之前未执行完毕的指令。
以上问题属网友观点,不代表本站立场,仅供参考!