Niuniuaba 发表于 2017-6-23 10:41:58

《零基础入门学习Python》笔记 023讲 递归-小兔崽子

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

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

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

def fab_1(m):
    f1=1
    f2=1
    f3=1
    if m<1:
      print('error!')
      return -1
    elif m == 1:
      return f1
    elif m == 2:
      return f2
    else:
      for i in range(3,m+1):
            f3=f1+f2
            f1=f2
            f2=f3
      return f3

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

print('%d个月后小兔崽子共%d对' % (months,result))

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

def fab_2(m):

    if m<1:
      print('error!')
      return -1
    else:
      if m == 1 or m == 2:
            return1
      else:
            return fab_2(m-1)+fab_2(m-2)

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

result = fab_2(monthes)

print('%d 个月后会有 %d对小兔崽子' % (monthes,result))


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

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


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

wuyanzulqq 发表于 2020-10-23 18:15:56

n3 = 1实在搞不懂,这是在循环之前给n3赋值吗{:10_245:}
页: [1]
查看完整版本: 《零基础入门学习Python》笔记 023讲 递归-小兔崽子