C语言的问题,这道题怎么做啊?

求详细解答

这个题,就是选择答案D。

图中,if(n/2)其实就是等价于if(n/2!=0),考虑到n是正数,它也就等价于if(n>1)

总之,

第一次调用,就满足条件,进行递归调用:fun(5)…………

具体见图所示(一个红框,就是一次函数调用):

依输出的先后次序,总的输出就是:1010

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-09-08

打印1010。

这是递归函数每次执行到调用自己的时候,要等调用的那个执行完才会返回继续执行下一条语句。

也就是说

if(n/2)fun(n/2);//每一次调用自己的这一句执行结束,才会执行下面的打印。

 printf("%d",n%2);

所以每一层都会打印自己的变量n%2的值。而最先执行打印的是最里一层的调用,整个执行过程分别是fun(10)->fun(5)->fun(2)->fun(1)。

既打印1%2,2%2,5%2,10%2,也就是1010。

第2个回答  2019-09-07
考你递归的用法:
10送入fun(10)
void fun(int n)
{
if(n/2)fun(n/2);//自身调用部分

printf("%d",n%2);//压栈部分
}

n/2=5,条件为真,调用函数fun(5),printf("%d",10%2);被压栈
n/2=2,条件为真,调用函数fun(2),printf("%d",5%2);被压栈
n/2=1,条件为真,调用函数fun(1),printf("%d",2%2);被压栈
n/2=0,条件为假,打印printf("%d",1%2);也就是1
由于栈是先进后出的,所以反相出栈,打印printf("%d",2%2);也就是0
然后打印printf("%d",5%2);也就是1
然后打印printf("%d",10%2);也就是0
所以结果为:1010追问

printf语句是不会被执行的吧?因为调用啊,执行到fun时,就转去调用,所以直到条件为假时,printf才会被执行啊

难道不是这么做的吗?

追答

条件为真的不是不执行,而是被压入栈,暂不执行,
条件为假后,要依次出栈执行,前面我说得已经
很明白了。

第3个回答  2019-09-08
这是一个把十进制数n转换为二进制数的程序,选择答案d。程序的运行是这样的,里面判断语句的功能就是说,如果n除以2的值大于0,就进行递归调用。这个语句也可以写成为如果n大于1就进行递归调用。等到递归调用返回时,再输出这个n除以2的余数,但是这个操作是要等递归调用返回后才输出的,所以是最后一次调用的时候的输出是最靠前的。这样就实现了反向除二取余数的功能,也就是说把n转换为二进制进行输出。
第4个回答  2019-09-06
四题选项B和D明显是相反条件啊,你只要判断出D是等价的,B肯定就是不等价的啊。
再说题意,while( E ) 就是说只有E的值为0的时候,条件判断结果为:false
D选项中 ( E != 0 ),当 E 的值为 0 的时候,条件判断为假:false----等价
B选项中 ( E == 0 ), 当 E 的值为 0 的时候,条件判断为真:true----不等价
综上,选B本回答被网友采纳
相似回答