鱼C论坛

 找回密码
 立即注册
查看: 1470|回复: 5

[已解决]python递归与print函数问题求解

[复制链接]
发表于 2018-4-3 11:11:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如果我在递归函数最后return之前使用print函数输出了东西,这个print就会执行多次
1.PNG
而且在我return的值不同时,print的也不一样:
2.PNG
在该递归函数中 不是应该c = fab(n-1)+fab(n-2)执行完了才继续往下执行吗,为什么,print函数会执行多次,而return却只执行一次呢?为什么return的值不同,print的值也会不一样?
最佳答案
2018-4-3 11:30:59
我也是刚弄清递归没多久:

f(5) -> f(4) -> f(3) -> f(2) ->
递归是一层一层的套用函数本身,只有当当 n <= 1的时候才不会执行print (c). print执行多次没有毛病

你的递归还是有一点问题,
应该改为:
当 n == 1, return 1
当 n == 2, return 2
当 n > 2, return fab(n-1) + fab(n-2)

就是注意每次运行一个递归的时候,都要有对应的return值,应该来说需要 return 一个下一层递归的函数,例如 return f(n-1) + x 之类的运行等式。 多尝试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-3 11:28:36 | 显示全部楼层
每次递归调用都会“继续往下执行”直到遇到return语句
不同的return返回的结果当然不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-3 11:30:59 | 显示全部楼层    本楼为最佳答案   
我也是刚弄清递归没多久:

f(5) -> f(4) -> f(3) -> f(2) ->
递归是一层一层的套用函数本身,只有当当 n <= 1的时候才不会执行print (c). print执行多次没有毛病

你的递归还是有一点问题,
应该改为:
当 n == 1, return 1
当 n == 2, return 2
当 n > 2, return fab(n-1) + fab(n-2)

就是注意每次运行一个递归的时候,都要有对应的return值,应该来说需要 return 一个下一层递归的函数,例如 return f(n-1) + x 之类的运行等式。 多尝试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-3 14:28:04 | 显示全部楼层
首先谢谢大佬的回复,我看了一下,主要都是说在遇到return前都会继续往下执行,但是我还是有点疑惑:
以第1幅图为例,递归如下:
fab(4)+fab(3)
fab(3)+fab(2)+fab(2)+fab(1)
fab(2)+fab(1)+fab(2)+fab(2)+fab(1)
而最后输出了5个数:2, 3, 2, 5, 5
我知道第五个是最后return的结果,那前四个又是怎么来的呢,递归没有执行完的话,c的值又是怎么来的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-4 09:05:33 | 显示全部楼层
炒糖色的鱼 发表于 2018-4-3 14:28
首先谢谢大佬的回复,我看了一下,主要都是说在遇到return前都会继续往下执行,但是我还是有点疑惑:
以第 ...

分享一下你的代码,应该是递归的思路有点问题。也可以参考小甲鱼的答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-4 21:59:38 | 显示全部楼层
炒糖色的鱼 发表于 2018-4-3 14:28
首先谢谢大佬的回复,我看了一下,主要都是说在遇到return前都会继续往下执行,但是我还是有点疑惑:
以第 ...

首先澄清一下,我不是大佬,我也是萌新。

是这样的,理想的递归应该是最终以return语句返回最终的值,使用print得到的值,你没有办法用在其他地方。
例如定义一个函数 f(): 其中使用 print(5), return 8. 若 a = f(),函数运行时会以 print 的形式输出 5,但 a 的值是 8。
上面是想说,你用print来输出答案是一种不理想的方式,不能被用于接下来的代码。

我理解中,递归的理想状态,是某一层的 return 值讲被用于上面一个层级的递归的运算:
例如 g(3) -> g(2) -> g(1),假设到 g(1) 是为最下面(最终)的层级,其实他的运算模式应该是 g(g(g(1)))。

我觉得这么解释有点抽象,分享你的代码,我们讨论印证。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 20:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表