Python中斐波那契数列的四种写法

枫铃3年前 (2021-07-10)Python244

在这些时候,我可以附和着笑,项目经理是决不责备的。而且项目经理见了孔乙己,也每每这样问他,引人发笑。孔乙己自己知道不能和他们谈天,便只好向新人说话。有一回对我说道,“你学过数据结构吗?”我略略点一点头。他说,“学过数据结构,……我便考你一考。

斐波那契数列用Python怎样写的?”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会。孔乙己等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些字应该记着。将来做项目经理的时候,写账要用。”我暗想我和项目经理的等级还很远呢,而且我们项目里也用不到斐波那契数列;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是f(n)
= f(n-1)+f(n-2)吗?”孔乙己显出极高兴的样子,将两个指头的长指甲敲着办公桌,点头说,“对呀对呀!……斐波那契数列在python中有四种写法,你知道么?”我愈不耐烦了,努着嘴走远。孔乙己刚拿出笔记本电脑,想要写几段程序,见我毫不热心,便又叹一口气,显出极惋惜的样子。

斐波那契数列的定义

f(0) = 1,f(1) = 1,f(n) = f(n-1) + f(n-2)

CODE

本次介绍Python中斐波那契数列的四种写法,第一种写法比较常见,第二种写法也比较常见.(鲁迅听了想打人).咳咳.第一种依赖于递归,第二种依赖与循环,前两种算法都是可以在几乎所有编程语言里面都能都快速移植的.我们先从这两种介绍

第一种:递归

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 递归
def Fibonacci_Recursion_tool(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2)


def Fibonacci_Recursion(n):
    result_list = []
    for i in range(1, n + 1): result_list.append(Fibonacci_Recursion_tool(i))
    return result_list

性能比较

这里我们使用time函数进行计时.并使用numpy类库保存到文件中

def Test_Fibonacci(n, list):
    t1 = time.clock()
    Fibonacci_Recursion(n)
    t2 = time.clock()
    l1 = t2 - t1

    t1 = time.clock()
    Fibonacci_Loop(n)
    t2 = time.clock()
    l2 = t2 - t1

    t1 = time.clock()
    Fibonacci_Yield(n)
    t2 = time.clock()
    l3 = t2 - t1

    t1 = time.clock()
    Fibonacci_Matrix(n)
    t2 = time.clock()
    l4 = t2 - t1
    list.append([l1,l2, l3, l4])
    print("第%d次的测试结果为:" % n, [l1,l2, l3, l4])


def Test_Save(times_items, filename):
    times_list = []
    for i in range(1, times_items + 1): Test_Fibonacci(i, times_list)
    np.savetxt(filename, times_list)


def Test_Print(Test_Print_n):
    print(Fibonacci_Recursion(Test_Print_n))
    print(Fibonacci_Loop(Test_Print_n))
    print(Fibonacci_Yield(Test_Print_n))
    print(Fibonacci_Matrix(Test_Print_n))


times_items = 40
filename = "/home/fonttian/Data/17_DS_AI/Fibonacci/Fibonacci_all.txt"
# Test_Save(times_items,filename)

从效果来看第一种效果最差在35以上的运算次数时,耗时就会达到1s,而其他的计算速度则仍然在十的负五次方到负六次方之间,当次数大于1000时,loop的速度开始明显不足.

而在pow(10000,10000)时,矩阵与yield的计算速度则为

0.27840600000000004
1.6000000000016e-05

看来还是yield性能好一些,但是实际上并不是,因为yield和np.Matrix实际上的运算机制导致,其实在大数量级运算时,各存在一个问题,yield实际上是没有运算?np.Matrix 则出现了内存溢出(导致的数值错误)

不过整体而言,最好的还是yield,这是python出色设计的功劳.

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。