糖逗 发表于 2019-11-11 12:40:39

带你学C递归的课后题

这个代码的输出结果不是很理解。
我理解的是输入2时流程:
up_and_down执行printf("%d\n", n);函数打印2----------》因为2>0、执行up_and_down(1)------------------》 执行printf("%d\n", n);打印1--------------》因为1>0,所以执行up_and_down(0)----------》 执行printf("%d\n", n)打印0--------------》因为0并不大于0,所以跳出递归执行后面的printf 打印0
按照这种思路分析的话结果是逐次递减的
但是为什么结果最后又逐次上升了?

jackz007 发表于 2019-11-11 13:32:24

本帖最后由 jackz007 于 2019-11-11 14:04 编辑

      首先,必须明确,函数 up_and_down(n) 在什么情况下会递归到底,那么,什么是递归到底呢?答案就是函数不再调用自己了,显然,up_and_down(n) 递归到底的条件是 n 的值为 0 。
      递归函数以底为界,可以划分为进入过程和退出过程,在进入过程中,up_and_down(n) 首先打印了 n 的数值,如果输入了数值 2,那么,在进入过程中,会依次打印数字 "2 "、"1 "、"0 ",然后,进入退出过程,打印 n (如果 n = 0) 或 n - 1(如果 n > 0),所以,退出过程将依次打印"0 "、"0 "、"1 "。最终打印输出的内容就是:"2 1 0 0 0 1"

糖逗 发表于 2019-11-11 14:06:41

jackz007 发表于 2019-11-11 13:32
首先,必须明确,函数 up_and_down(n) 在什么情况下会递归到底,那么,什么是递归到底呢?答案就是 ...

看到您的回复后,进入过程似乎明白了为什么是2、1、0.但是退出过程还是有点儿懵,它减一了为啥还会变为0、0、1递增呢

jackz007 发表于 2019-11-11 14:11:18

糖逗 发表于 2019-11-11 14:06
看到您的回复后,进入过程似乎明白了为什么是2、1、0.但是退出过程还是有点儿懵,它减一了为啥还会变为0 ...

      递归到底的时候,n = 0,会输出 "0 ",然后,递归返回 n = 1 那一层,无疑,打印 n - 1 的结果还是 "0 ",然后,递归返回 n = 2 那一层,也就是最外层,打印 n - 1 的结果无疑是 "1 "。

糖逗 发表于 2019-11-11 14:11:30

jackz007 发表于 2019-11-11 13:32
首先,必须明确,函数 up_and_down(n) 在什么情况下会递归到底,那么,什么是递归到底呢?答案就是 ...

我好像明白了   

糖逗 发表于 2019-11-11 14:41:55

记录一下我看过的和递归有关的一个博文https://blog.csdn.net/it8343/article/details/80180448
页: [1]
查看完整版本: 带你学C递归的课后题