解释下面代码的输出?

时间:2016-10-21 12:10:07

标签: c recursion

void count(int n){
    static int d=1;
    printf("%d",n);
    printf("%d",d);
    d++;
    if(n>1) count(n-1);
    printf("%d",d);
}
int main(){
    count(3);
}

我是编程的新手,所以请帮助我理解,为什么即使在'if'语句为false之后输出还包含两个4,并且之后没有递归调用该函数?

2 个答案:

答案 0 :(得分:3)

因为函数末尾有printf("%d",d);

此语句多次执行。

展开count(3)的递归调用,我们得到。

3
1
count(2)
d

进一步展开,我们得到。

3
1
   2
   2
   count(1)
   d
d

再次展开,我们得到了,

3
1
   2
   2
       1
       3
           ... recursion ends here
       d
   d
d

答案 1 :(得分:2)

进行递归调用时,不会将控制转移到永远调用的函数。如果在进行调用的函数中有一些未完成的工作,那么一旦递归调用结束,它将获得控制权以完成未完成的工作。

在您的情况下,"未完成的业务"是最后一次printf电话。有三个count的调用。第三次调用退出后,第二次调用将打印d,即4,然后退出。反过来,这会将控制权交还给第一次调用,再次打印4