斐波那契数列——普通递归、记忆化搜索、动态规划

普通递归

import time


def fibo(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fibo(n-1) + fibo(n-2)


n = 35

start_time = time.time()
a = fibo(n)
end_time = time.time()

print("fibo(%d) = %d" % (n, a))
print("runing time = ", end_time-start_time)

在这里插入图片描述
普通递归由于进行了大量重复计算,n=35在我的计算机上需要5秒多,n每增加1运行时间为指数级增长。

记忆化搜索

import time


def fibo(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    if memory[n] == -1:
        memory[n] = fibo(n-1) + fibo(n-2)
    return memory[n]


n = 35
memory = [-1] * (n+1)

start_time = time.time()
a = fibo(n)
end_time = time.time()

print("fibo(%d) = %d" % (n, a))
print("runing time = ", end_time-start_time)

在这里插入图片描述
记忆化搜索,建立一个列表存储计算过的数值,递归的时候不需要重复计算,运行时间大大减少。由于python递归存在最大递归深度,当n数值较大时,例如n=10000,会抛出异常:RecursionError: maximum recursion depth exceeded in comparison.

动态规划

import time


def fibo(n):
	memory = [0, 1]
	for i in range(2, n+1):
		memory.append(memory[i-1] + memory[i-2])
	return memory[n]


n = 10000

start_time = time.time()
a = fibo(n)
end_time = time.time()

print("fibo(%d) = %d" % (n, a))
print("runing time = ", end_time-start_time)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值