C语言 为什么下面的递归函数在调用return时不结束?

cclgggtu  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(234)
#define LIMIT 1000
void fun2(int n)
{
  if (n <= 0)
     return;
  if (n > LIMIT)
    return;
  printf("%d ", n);
  fun2(2*n);
  printf("%d ", n);
}   `

对于小于LIMIT的值,代码将输出n、2n、4n、8n ......。但是它会以相反的顺序打印。例如,fun2(100)将打印100、200、400、800、800、400、200、100。为什么它不打印到800,然后在调用return后退出呢?
我已经试过一行一行地去做了,但是我不明白。我还在学习C语言中的递归函数。

oprakyz7

oprakyz71#

该函数以相反的顺序打印,因为您调用了printf("%d ", n);两次,一次在调用该函数之前,一次在调用该函数之后。
所以执行过程是这样的:
首先用一个值调用函数,如果它大于零且小于LIMIT,它将打印该值,并再次调用函数,但使用2*n,因此该过程重复进行,直到值大于LIMIT,在这种情况下,函数将返回(因为是void型别,所以没有任何作用),所以呼叫它的前一个函式会继续执行,将打印第二个printf("%d ", n);并退出,并返回到其调用者,调用者将执行相同的操作,执行printf("%d ", n);。这将重复,直到第一个调用函数返回到fun2()的调用者,例如main。
希望你能理解,如果不是,C中有大量关于递归函数的信息。试着阅读一下K&R会有所帮助。

相关问题