一.什么是动态规划
二.什么是递归
三.递归和动态规划的区别
四.举例:斐波那契数列
一.什么是动态规划
1.动态规划
概述:动态规划是运筹学的一个分支,是求解决策过程最优化的过程
大白话解释: 是个求解最优 解决方案 的过程
我们从上述这句话中看到一个新名词,叫做决策过程.那么什么是决策过程呢?
2.决策过程:
概述:决策过程是从提出问题,确定目标开始,经过方案选优、作出决策、交付实施为止的全部过程。
大白话解释:从 发现问题 到 制定方案 和 解决问题 的过程
举例说明:
(1)发现问题:小黄有点胖
(2)制定问题方案:每天做俯卧撑100个
(3)实施方案:每天去做俯卧撑100个
在我们了解了动态规划的一些基本含义后,我们再来复习一下 递归 的含义
二.什么是递归
1.递归:
概述:在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。
大白话解释:指的是函数在执行过程中自己调自己的一种行为
2.用递归解决斐波那契数列
斐波那契数列题目:
(1) 一对小兔子, 1个月之后会长成1对大兔子.
(2) 每对大兔子, 每个月都会生1对小兔子.
(3)假设所有兔子都不死的情况的, 问: 1对小兔子, 1年之后会变成多少对兔子?
分析如下:
我们都知道,递归要找到出口和规律,由我们的分析可以得出以下结论:
# 1. 定义函数.
import time
def get_rabbit(month):
"""
该函数用于计算 每月的兔子对数
:param month: 要计算兔子对数的 月份
:return: 该月的兔子总对数
"""
# 出口, 前两个月的兔子对数 = 1
if month == 1 or month == 2:
return 1
# 规律, 从第3个月开始, 每月的兔子对数 = 上月兔子对数 + 上上月兔子对数
return get_rabbit(month - 1) + get_rabbit(month - 2)
# 2. 调用函数.
if __name__ == '__main__':
start_time = time.time()
print(get_rabbit(30))
end_time = time.time()
elapsed_time = end_time - start_time
print(f'递归执行时间为{elapsed_time}')
三.递归和动态规划的区别
时间复杂度不同
动态规划代码:
start_time = time.time()
num_list = [1, 1]
# 索引: 0 1 2 ..... 11(刚好是第12个月)
# 2. 遍历, 往列表中添加元素, 规律是: 当前数字 = 前两个数字之和.
for i in range(2, 30): # 包左不包右, 即: 2 ~ 30, 分别表示 3 ~ 30月
# 计算当前月的兔子对数, 并添加到列表中.
rabbits = num_list[i - 1] + num_list[i - 2]
num_list.append(rabbits)
# 3. 打印结果.
print({num_list[-1]})
end_time = time.time()
elapsed_time = end_time - start_time
print(f'动态规划执行时间为{elapsed_time}')