鱼C论坛

 找回密码
 立即注册
查看: 4336|回复: 1

[技术交流] 《零基础入门学习Python》笔记 023讲 递归-小兔崽子

[复制链接]
发表于 2017-6-23 10:41:58 | 显示全部楼层 |阅读模式

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

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

x
解决著名的斐波那契数列问题:用迭代和递归两种方法

0. 数学描述 为一个分段函数
     
                    1                         n=1
     F(n)=      1                         n=2
                     F(n-1)+F(n-2)   n>2

1.  迭代法实现(跟小甲鱼实现方法不同)
  1. # 这帮小兔崽子 迭代实现法

  2. def fab_1(m):
  3.     f1=1
  4.     f2=1
  5.     f3=1
  6.     if m<1:
  7.         print('error!')
  8.         return -1
  9.     elif m == 1:
  10.         return f1
  11.     elif m == 2:
  12.         return f2
  13.     else:
  14.         for i in range(3,m+1):
  15.             f3=f1+f2
  16.             f1=f2
  17.             f2=f3
  18.         return f3

  19. months = int(input("请输入你想的时间,多少个月:"))
  20. result = fab_1(months)

  21. print('%d个月后小兔崽子共%d对' % (months,result))
复制代码


2. 用递归法实现
  1. # 用递归进行小兔崽子的计算

  2. def fab_2(m):

  3.     if m<1:
  4.         print('error!')
  5.         return -1
  6.     else:
  7.         if m == 1 or m == 2:
  8.             return  1
  9.         else:
  10.             return fab_2(m-1)+fab_2(m-2)

  11. monthes = int(input('请输入月数:'))

  12. result = fab_2(monthes)

  13. print('%d 个月后会有 %d对小兔崽子' % (monthes,result))
复制代码


3.  小甲鱼使用迭代法的实现过程:采用倒着推的while循环。

  1. #采用迭代方法实现经20个月之后的兔子总对数值
  2. def fab(n):                          #定义函数,参数为月数,通过迭代实现对应的兔子总对数
  3.     n1 = 1
  4.     n2 = 1
  5.     n3 = 1
  6.     if n < 1:                           #n值小于1时则提示‘输入错误’并返回-1
  7.         print('输入有误!')
  8.         return -1
  9.     while(n-2) > 0:                #月数大于2时,则进行循环
  10.         n3 = n1 + n2              #n3为n1和n2之和
  11.         n1 = n2                       #将n2值赋给n1
  12.         n2 = n3                       #将n3值赋给n2
  13.         n -= 1                          #n自减一
  14.     return n3   
  15. result = fab(20)                  #输入月数为20时计算兔子总对数
  16. if result != -1:
  17.     print('经过20个月产生的兔子总对数为%d!' %result)
复制代码


4. 总结: 关于迭代和递归的使用问题,个人认为,能用迭代实现的计算尽量用迭代;鉴于递归的执行效率问题,要用于该用的地方(好像是废话哈,嘿嘿)。

评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4 支持楼主!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-23 18:15:56 | 显示全部楼层
n3 = 1实在搞不懂,这是在循环之前给n3赋值吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 14:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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