鱼C论坛

 找回密码
 立即注册
查看: 1963|回复: 4

关于小甲鱼老师课堂举例递归的实现顺序疑问求助

[复制链接]
发表于 2017-4-13 10:44:13 | 显示全部楼层 |阅读模式

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

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

x
(递归实现)
def fab(n):
     if n < 1:
         print('输入有误!')
         return -1
    if n==1 or n==2:
         return 1
     else:
         return fab(n-1) + fab(n-2)

result = fab(20)
if result != -1:
     print('总共有%d对小兔崽子诞生!' % result)

>>>
总共有6765对小兔崽子诞生!

上面的递归函数中 if n==1 or n==2:
                         return 1
我测试了下,如果将return 1 改为  return -1,则程序运行结果为总共哟-6765对兔子诞生!  

else:
         return fab(n-1) + fab(n-2)
语句我理解是从20-1开始倒数计数,就算 if n==1 or n==2:满足时,也是最后2次才执行,-1只影响2次,难道这个函数的执行是从1开始执行到20结束的吗?请大家给帮忙分析下,我这会想不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-13 12:09:24 | 显示全部楼层
这个递归是从20开始到1或者2,因为到1或者2的时候才有具体的值,没有继续的函数,然后再从1或者2向后开始计算
如果n=3的话,第一步是return fbs(3-1)+fbs(3-2)。。。而fbs(2)和fbs(1)都为1,因为有了具体的返回值,所以讲结果返回第一步,即return 1+1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 14:20:09 | 显示全部楼层
以n=4为例看看,
fab(4)
= fab(3) + fab(2)
= (fab(2) + fab(1)) + fab(2)
= (-1 + -1) + -1
=-3
是不是return -1改变了所有的fab()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-13 17:38:08 | 显示全部楼层
冬雪雪冬 发表于 2017-4-13 14:20
以n=4为例看看,
fab(4)
= fab(3) + fab(2)

感谢回复,你的回复的意思是难道所有的20以内这些数,都分解成了fab(2)+fab(1)的模式来执行吗?有点晕了,
2楼这位鱼油说‘’这个递归是从20开始到1或者2,因为到1或者2的时候才有具体的值,没有继续的函数,然后再从1或者2向后开始计算
如果n=3的话,第一步是return fbs(3-1)+fbs(3-2)。。。而fbs(2)和fbs(1)都为1,因为有了具体的返回值,所以讲结果返回第一步,即return 1+1‘’我觉得也有道理,到底该怎么理解呢??????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-14 12:36:23 | 显示全部楼层
把执行过程打印出来了,再看上面两位说的,我基本懂了递归的执行过程了,谢谢了!
def fab(n):
    print('n','=',n)
    if n<1:
        print('输入有误!')
        return -1
    if n == 1 or n == 2:
        print('-------------------------')
        print('n1','=',n)
        return 1
    else:
        print('+++++++++++++++++++++++++++++++')
        print('n-1','=',n-1)
        print('n-2','=',n-2)
        print('fab(n-1)','=',fab(n-1))
        print('fab(n-2)','=',fab(n-2))
        return fab(n-1) + fab(n-2)
      

result = fab(4)
if result != -1:
    print ('总共哟%d对兔子诞生!'%result)


执行过程打印:

n = 4
+++++++++++++++++++++++++++++++
n-1 = 3
n-2 = 2
n = 3
+++++++++++++++++++++++++++++++
n-1 = 2
n-2 = 1
n = 2
-------------------------
n1 = 2
fab(n-1) = 1
n = 1
-------------------------
n1 = 1
fab(n-2) = 1
n = 2
-------------------------
n1 = 2
n = 1
-------------------------
n1 = 1
fab(n-1) = 2
n = 2
-------------------------
n1 = 2
fab(n-2) = 1
n = 3
+++++++++++++++++++++++++++++++
n-1 = 2
n-2 = 1
n = 2
-------------------------
n1 = 2
fab(n-1) = 1
n = 1
-------------------------
n1 = 1
fab(n-2) = 1
n = 2
-------------------------
n1 = 2
n = 1
-------------------------
n1 = 1
n = 2
-------------------------
n1 = 2
总共哟3对兔子诞生!
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 12:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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