递归算法——菲波那契

#递归
是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。
(来源于百度,看不懂正常,术语就是不说人话)


###菲波那契数列:
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…数列从第3项开始,每一项都等于前两项之和。

先上代码:

import datetime


def fib(n):

    if n <2:

        return n

    else:
        return fib(n -1) + fib(n -2)

if __name__ == '__main__':
    n = int(input("请输入一个正整数:"))
    time1 = datetime.datetime.now()
    print(str(n)+"序列上数字为:",fib(n))
	time2	 = datetime.datetime.now()
    print("计算菲波那契数列锁需要花费的时间。",time2-time1)

输出:
请输入一个正整数:3
3序列上数字为: 2
计算菲波那契数列锁需要花费的时间。 0:00:02.062182


明天继续更新,加油!!!


迟到的更新

理解递归思路,直接上代码

import datetime

def fib(n):

    if n < 2:
        print("f(" + str(n) + ")" + "=" + str(n),"递归")
        return n

    else:
        print("f(" + str(n) + ")="  + "f(" + str(n - 1) + ")" + " + f(" + str(n - 2) + ")");
        r =  fib(n -1) + fib(n -2)
        print("f(" + str(n) + ")" + "=" + str(r))
        return r

if __name__ == '__main__':

    n = int(input("请输入一个正整数:"))
    time1 = datetime.datetime.now()
    print(str(n)+"序列上数字为:",fib(n))
    time2 = datetime.datetime.now()
    print("计算菲波那契数列锁需要花费的时间。",time2-time1)

输出:
请输入一个正整数:5
f(5)=f(4) + f(3)
f(4)=f(3) + f(2)
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(1)=1 s
f(3)=2
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(4)=3
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(1)=1 s
f(3)=2
f(5)=5
5序列上数字为: 5
计算菲波那契数列锁需要花费的时间。 0:00:00.000294

从上面的步骤我们可以清晰的看到递归算法的第一步是分治,把复杂的大的问题,给拆分成一个一个小问题,直到不能再拆解,通过退出条件retrun,然后再从最小的问题开始解决,只到所有的子问题解决完毕,那么最终的大问题就迎刃而解。上面的打印信息,符合栈数据结构的定义,先进后出,通过把所有的子问题压栈之后,然后再一个个出栈,从最简单的步骤计算,最终解决大问题,非常形象。

f(5) = f(4) + f(3)
f(4)=f(3) + f(2)
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)返回值自身为1
f(0)返回值自身为0
f(2) = f(1) + f(0) = 1
f(3)= f(2) + f(1)
f(1)返回值自身为1
f(3) = 2
f(4)=f(3) + f(2)
f(2)=f(1) + f(0)
f(1)返回值自身为1
f(0)返回值自身为0
f(2) = 1
f(4) = 3
以此类推下去最终得到结果f(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT__init__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值