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