c语言二级考试题目有点难啊

c语言二级考试题目有点难啊

问题描述:

#include<stdio.h>
void fun (int n){
if (n/2) fun(n/2);
printf("%d",n%2);}
int main()
{
fun(10);
printf("\n");}
这个结果为什么是1010不是1

首先你要明白一个函数是可以调用另外一个函数的,也可以是函数自己。那么这个例子里面当我第一次调用函数的时候,函数会调用自己再执行,所以会是一个无穷无穷尽的执行(在没有终止条件的前提下),我们此处的不再递归的条件是不满足n/2

void fun (int n) {
    if (n/2)       // 判断n/2是否>0 其实也就等价于n是否<1
        fun(n/2);  // 如果n>1则执行再执行一次fun,新的参数为 n/2。
    printf("%d",n%2);  // 上面的fun执行完了才会输出这一句。
}

我们模拟程序运行一下:
第一次传入10.执行fun(10)
fun(10)中:if (10/2) 执行fun(5)
fun(5)中: if (5/2) 满足条件 执行fun(2)
fun(2)中: if (2/2) 满足条件 执行fun(1)
fun(1)中: if (1/2) 不满足条件,执行print(1%2),也就是【1】,返回fun(2)继续执行fun(2)剩余的代码
fun(2)中: 执行print(2%2),也就是【0】,返回fun(5)继续执行fun(5)剩余的代码
fun(5)中: 执行print(5%2),也就是【1】,返回fun(10)继续执行fun(10)剩余的代码
fun(5)中: 执行print(10%2),也就是【0】
所以最终结果,1,0,1,0

望采纳。

说简单点,这是递归调用了4次的结果,每次只打了一个数出来了,4个数连在一起就是你看到的结果。
你可以把这一句改一下printf("%d",n%2)改成printf("%d ->",n%2)就能看出来了.

首先看主函数
执行fun(10)
将10传入函数中:
执行if语句,括号中表达式值为5--->执行fun(5)--->执行if语句,括号中表达式为2--->执行fun(2)--->执行if语句,括号中表达式为1--->执行fun(1)--->执行if语句,括号中表达式为0,不继续执行if后面的语句--->输出1%2,即1--->输出2%2,即0--->输出5%2,即1--->输出10%2,即0--->输出回车
所以,该代码运行后结果为1010