看图回答C语言基础问题!!有效回答可获得50鱼币!!
本帖最后由 Runpire 于 2023-3-23 19:29 编辑以下代码结果是:先输出了 if 内部函数执行的结果(5432100),
函数执行完 n = 0
{:10_243:} 为什么 if 下面的输出语句还能从 0 执行 5 次自增输出结果为 (0 1 2 3 4)呢 ???
{:10_269:} 是否因为递归的出栈入栈是先进后出的原则 ???
你递归一层一层往里进完之后还是要一层一层往外出的
每次执行完 up_and_down(--n) 并不会直接drop掉下面的printf,而是等 if条件 不满足开始往外解递归的时候一层一层执行
假设现在到了最底层 n=0 了,那么 if条件 不满足,下面的printf打印一个0
然后往回退一层,n=1,但是由于执行了 up_and_down(--n) ,所以到下面那个printf的时候n=0了,所以再打印0
然后再往回退一层,n=2,同样因为执行了 up_and_down(--n) ,所以到下面prinf的时候n就=1了,所以打印1
以此类推......
直到退回最外层,n=5,由于 up_and_down(--n) ,所以打印4
然后递归结束返回main然后return 0 1、首先传入5,判断后5>0 , 5减一变为4的参数再次调用函数
2、输出4之后调用函数
...
3、省略中间的输出到输出1
4、输出1之后,1>0,调用函数
5、输出0,此时不执行if里面调用函数的 语句 ,执行下面的输出制表符的语句,再次输出0,此次函数调用结束
6、第4条里面n为1的if语句执行完毕。执行下面有制表符的输出,输出 1 ,函数调用结束
7、第六条里面 n 为1 的函数是前一次 n 为2 时 的函数 调用 , 结束调用之后 执行if下面的语句 ,此时 输出 带有制表符的2
8、依次类推
注:这个里面if不会中断,只是将带制表符的输出延后了,函数结束后依然会调用 if只是一个判断,它的结果是否成立只影响if{语句块}之内的内容是否被执行,不会影响if{}之后的语句
两手空空儿 发表于 2023-3-23 10:56
if只是一个判断,它的结果是否成立只影响if{语句块}之内的内容是否被执行,不会影响if{}之后的语句
返回过程是原理就是会返回输出n个数字吗,
printf("%d\t",n);
在if后面被延后输出,为什么输入5函数不是 43210的输出呀 小怪兽@ 发表于 2023-3-23 08:12
1、首先传入5,判断后5>0 , 5减一变为4的参数再次调用函数
2、输出4之后调用函数
...
返回过程是原理就是会返回输出n个数字吗,
printf("%d\t",n);
在if后面被延后输出,为什么输入5函数不是 43210的输出呀 先用调试器跟踪一遍执行过程试试吧 dolly_yos2 发表于 2023-3-23 15:32
先用调试器跟踪一遍执行过程试试吧
没听明白 首先传入5,判断后5>0 , 5减一变为4的参数再次调用函数
2、输出4之后调用函数
...
3、省略中间的输出到输出1
4、输出1之后,1>0,调用函数
5、输出0,此时不执行if里面调用函数的 语句 ,执行下面的输出制表符的语句,再次输出0,此次函数调用结束
6、第4条里面n为1的if语句执行完毕。执行下面有制表符的输出,输出 1 ,函数调用结束
7、第六条里面 n 为1 的函数是前一次 n 为2 时 的函数 调用 , 结束调用之后 执行if下面的语句 ,此时 输出 带有制表符的2
8、依次类推
注:这个里面if不会中断,只是将带制表符的输出延后了,函数结束后依然会调用
这个我是问的我的c语言老师 Runpire 发表于 2023-3-23 15:26
返回过程是原理就是会返回输出n个数字吗,
printf("%d\t",n);
在if后面被延后输出,为什么输入5函数不 ...
你在主函数里是将5传入后调用的函数,这是第一次调用函数,先输出5,然后if语句里才依次 --n 芜湖666 发表于 2023-3-23 17:36
首先传入5,判断后5>0 , 5减一变为4的参数再次调用函数
2、输出4之后调用函数
...
亲,你这回答跟一楼的没什么区别呀 {:10_245:} 小怪兽@ 发表于 2023-3-23 18:04
你在主函数里是将5传入后调用的函数,这是第一次调用函数,先输出5,然后if语句里才依次 --n
这个我知道,我是不太明白 if 下面的输出可以自增而且是5次,这是递归的规律是吗 本帖最后由 两手空空儿 于 2023-3-23 18:27 编辑
Runpire 发表于 2023-3-23 15:26
返回过程是原理就是会返回输出n个数字吗,
printf("%d\t",n);
在if后面被延后输出,为什么输入5函数不 ...
你的说法就不太对,我说的返回是子程序的返回
printf("%d\t",n);这个是你让它输出的,不是返回产生输出,删掉这一句就没有后面的输出了
你要先想清楚程序执行的路线,它是只会向一个方向走的,不会走回头路(除非你直接jump回去)
函数A调用一个函数B,B执行完就会返回到函数A,继续执行A后面还没有被执行的语句
在进入B之前要先保存A内的数据(这里示例保存了n,push(n)) //调用前保护现场
B执行完回到A,在执行A内的语句前要恢复原来的数据(pop(n)) //返回后恢复现场
然后开始执行A剩下的语句
你注意一下我写的{}和缩进,看一下层次,你先把它想成一个普通函数调用,再理解这里的递归调用 {:10_254:} 经过找了个朋友一步步帮我分析,虽然还是会有点迷惑,可能是因为没有代码的流程图,笨笨的脑袋但看思路一时间转不过来,这是我的缺点,我会慢慢进步的,非常谢谢大家的解答,对我的启发也非常有效,下面是我自己进行的思路推导,还麻烦大家帮我看看,是否这样去想是对的{:10_254:}
int main 调用函数然后到函数内
函数内输出5后判断n大于0后,执行n=n-1=4 并且再次调用函数,
以此内推输出:5 4 3 2 1 0
到 0 的时候if不成立就输出下面的printf再次输出 0
所以输出会为:5 '\n' 4 '\n' 3 '\n' 2 '\n' 1 '\n' 0 '\n' 0 '\t'
if 下面的printf被延迟执行了5次,所以会从 n = 0 开始执行回调5次
输出就为:0 '\t' 1 '\t' 2 '\t' 3 '\t' 4
所以整个输出就会
5 '\n' 4 '\n' 3 '\n' 2 '\n' 1 '\n' 0 '\n' 0 '\t' 0 '\t' 1 '\t' 2 '\t' 3 '\t' 4
两手空空儿 发表于 2023-3-23 18:24
你的说法就不太对,我说的返回是子程序的返回
printf("%d\t",n);这个是你让它输出的,不是返回产生 ...
对,我明白5432100的输出,我是不明白它为什么可以又调用5次 if 下面的 输出,是因为if内部调用了函数5次的原因吗,所以外部也会进行相对应的次数 两手空空儿 发表于 2023-3-23 18:24
你的说法就不太对,我说的返回是子程序的返回
printf("%d\t",n);这个是你让它输出的,不是返回产生 ...
if 内部的函数结束后 n 是 0 的,再执行if下面的语句n也是从0开始,这里我都理解,我是不理解它为什么还可以从0 一直自增1(5次)
然后看完你说的保护现场和恢复现场,我理解成 if 和 if下面的语句不是同时进行的,编译从上到下一条线的规则,是否就是 if 内部 执行了函数使if执行 了5次,所以和if同级的语句也会被执行输出5次,然后以入栈和出栈的思维,先进后出,所以就形成了 01234 而不是 43210
你看看我这样想是否可以 水贴 Runpire 发表于 2023-3-23 18:20
亲,你这回答跟一楼的没什么区别呀
等明天问一下我的c语言老师吧 芜湖666 发表于 2023-3-23 20:57
等明天问一下我的c语言老师吧
我觉得你不如直接问gpt
我觉得gpt的回答不见的会比你的老师的回答差
人造人 发表于 2023-3-23 21:08
我觉得你不如直接问gpt
我觉得gpt的回答不见的会比你的老师的回答差
gtp 让我想起了今天白天看到的一篇文章,ChatGTP 要取代程序员了{:10_245:}
页:
[1]
2