斐波纳茨数列-基于python3.X

一.认识斐波纳茨数列
斐波纳茨数列指的是这样一个数列:1、1、2、3、5、8、13、21、……
斐波纳茨数列又因数学家列昂纳多·费波纳茨以兔子繁殖为例子而引入,故又称为“兔子数列”。一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?我们不妨拿新出生的一对小兔子分析一下:第一个月小兔子没有繁殖能力,所以还是一对;两个月后,生下一对小兔民数共有两对;三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;------依次类推可以列出下表:经过月数:—1—2—3—4—5—6—7—8—9—10—11—12兔子对数:—1—1—2—3—5—8–13–表中数字1,1,2,3,5,8---构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。这个特点的证明:每月的大兔子数为上月的兔子数,每月的小兔子数为上月的大兔子数,即上上月的兔子数,相加。
斐波纳茨数列是很有趣的数列,如还想深入了解,请自行百度。
二.用python实现计算费波纳茨数列
1.计算斐波纳茨数列的第n位是多少
方法1:使用for循环

def Fib(n): 
    if n==1 or n==2:
        return 1
    a=1
    b=1
    for i in range(3,n+1):
        temp=a
        a=b
        b=a+temp
    return b  

方法2:使用递归的方式

def Fib(n): 
        if n==1 or n==2:
            return 1
        return Fib(n-1)+Fib(n-2)
>>> Fib(1000)  #运用一下
RecursionError: maximum recursion depth exceeded in comparison
>>> Fib(0)  #同Fib(1000),因为没有递归出口,一直在压栈
RecursionError: maximum recursion depth exceeded in comparison

为什么会报错呢?很简单,我们都知道子程序调用(call)需要压栈出栈,如果无限递归调用,那么就一直压栈,没有出栈,内存消耗也越来愈多。python比较高级,直接抛出这个异常,结束程序运行。
栈是数据结构的概念。可以把栈比成一堆叠放的盘子,出栈就是取出最顶端的盘子,压栈就是把外面的盘子放到顶端。除此之外栈不能有其它操作。因此它和队列一样是受限的线性表。
我理解的意思是如要计算Fib(1000)则要先知道Fib(999)+Fib(998)以此类推,直到找到递归出口,在还未找到递归出口时,之前被调用的函数一直放在内存里,导致内存越来越多,最后抛出异常。如Fib(5)就不会报错,再还未抛出异常时Fib(5)就被计算出来了,然后按照Fib(1)、Fib(2)的顺序出栈。
2.将数放到一个list里
方法1:

def fib(n):
    result=[]
    if n==1:
        return [1]
    if n==2:
        return [1,1]
    a=1
    b=1
    for i in range(1,3):
            result.append(1)
    for i in range(3,n+1): #或者range(n-2)
        temp=a
        a=b
        b=a+temp
        result.append(b)
    return result
    >>> fib(5)
    [1, 1, 2, 3, 5]

方法2

 Fib_list=[]
    for i in range(10):
        if i==0 or i==1:
            Fib_list.append(1)
        else:
            Fib_list.append(Fib_list[i-1]+Fib_list[i-2])
     >>> print(Fib_list)
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

三.综上所述可以看出:
1、递归的特点
递归算法是一种直接或间接调用自身算法的过程,在计算机编程中,递归算法对解决一大类问题是十分,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1)递归就是在过程或函数里调用自身
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。
(4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。

2、递归的要求
递归算法所体现的“重复”一般有三个要求:
(1)每次调用在规模上都有所缩小(通常是减半)
(2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)
(3)在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模位达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值