Python 实现 动态规划 /斐波那契数列
1、斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(3)=2,F(n)=F(n-1)+F(n-2)(n>=4,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
(1)、递归算法 (三点: 终止条件(边界),最优子结构 F(1)=1,F(2)=1, F(3)=2,F(n)=F(n-1)+F(n-2) 状态转移公式 F(n)=F(n-1)+F(n-2))
def fab(n):
# 终止条件 边界
if n <= 2:
return 1
else:
# 最优子结构 状态转移公式
return fab(n - 1) + fab(n - 2)
(2)、优化 递归算法 会重复计算多次同一个式子 如图 相同的颜色代表了方法被传入相同的参数。所以需要记录下已经计算过得数,防止重复计算

# 记录已经计算过得 值
dict_fab = {} def fab_2(n):
# 终止条件 边界
if n <= 2:
return 1
elif dict_fab.get(n):
print('*')
return dict_fab.get(n)
else:
# 最优子结构 状态转移公式
dict_fab[n] = fab_2(n - 1) + fab_2(n - 2)
return dict_fab[n]
(3)、动态规划
# 最终优化 动态规划 (大问题化成若干相同类型的子问题 然后一个个解决子问题)
def fab_3(n):
# 由前往后推
a = 1
b = 1
if n <= 2:
print('fab({})={}'.format(n, b))
return 1
for i in range(n - 2):
print(a, b)
a, b = b, a + b
print('fab({})={}'.format(n, b))
return b
2、盛水问题 Python解法(题目链接https://leetcode.com/problems/trapping-rain-water/description/ )
(1)、暴力解法
def trap(height):
sum_water = 0
size = len(height)
for i in range(size):
max_left = 0
max_right = 0
for j in range(0, i + 1):
max_left = max(max_left, height[j])
for j in range(i, size):
max_right = max(max_right, height[j])
sum_water += min(max_left, max_right) - height[i]
return sum_water
(2)、动态规划(记忆算法,记录i 位置的左右 最大数,减少for循环层级 时间复杂度 有o(n²)变为 o(n))
def trap_water_dy():
height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
sum_water = 0
size = len(height)
max_left_lsit = [None]*size
max_left_lsit[0] = height[0]
max_right_list = [None]*size
max_right_list[-1] = height[-1] for i in range(1, size):
max_left_lsit[i] = max(height[i], max_left_lsit[i - 1]) for i in range(size-1):
max_right_list[size - 2 - i] = max(height[size - 2 - i], max_right_list[size - i - 1]) for i in range(size):
sum_water += min(max_left_lsit[i], max_right_list[i]) - height[i]
return sum_water
(3)、双指针
def trap_two_point():
height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
left = 0
right = len(height) - 1
ans = 0
left_max = 0
right_max = 0
while left < right: # 循环数组一遍
if height[left] < height[right]: # 当左边的小于右边的 能装多少水 由左边的最高高度决定
if height[left] >= left_max:
left_max = height[left]
ans += (left_max - height[left])
left += 1
else: # 当右边小于左边时 装的水量由右边的最高高度决定
if height[right] >= right_max:
right_max = height[right]
ans += (right_max - height[right])
right -= 1
return ans
Python 实现 动态规划 /斐波那契数列的更多相关文章
- 算法 递归 迭代 动态规划 斐波那契数列 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Python与Go斐波那契数列
#!/usr/bin/env python # -*- coding: utf-8 -*- # 斐波那契数列 def fibonacci_sequence(num): aa = 0 b = 1 li ...
- python练习:斐波那契数列的递归实现
python练习:斐波那契数列的递归实现 重难点:递归的是实现 def fib(n): if n==0 or n==1: return 1 else: return fib(n-1)+fib(n-2) ...
- 如何使用Python输出一个[斐波那契数列]
如何使用Python输出一个[斐波那契数列]Fibonacci 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonac ...
- Python递归及斐波那契数列
递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...
- Python递归函数与斐波那契数列
定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 阶乘实例 n = int(input(">>:")) def f(n): s ...
- python练习题-打印斐波拉契数列前n项
打印斐波拉契数列前n项 #encoding=utf-8 def fibs(num): result =[0,1] for i in range(num-2): result. ...
- Python练习笔记——斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...
- Python生成器实现斐波那契数列
比如,斐波那契数列:1,1,2,3,5,8,13,21,34.... 用列表生成式写不出来,但是我们可以用函数把它打印出来: def fib(number): n, a, b = 0, 0, 1 wh ...
随机推荐
- linux中的&&,|| 与 () 命令
用&&连接两个命令,前一命令执成功(返回0)下一命令才会执行, 如 date && echo 1 会打印1,而data && echo 2不会打印2 & ...
- [BOI2004]Sequence 数字序列(左偏树)
PS:参考了黄源河的论文<左偏树的特点及其应用> 题目描述:给定一个整数序列\(a_1, a_2, - , a_n\),求一个递增序列\(b_1 < b_2 < - < ...
- jmeter笔记(2)--组件介绍
1.测试计划 测试计划(Test Plan)是使用JMeter进行测试的起点,它是其它JMeter测试元件的容器. 2.Threads(Users)-线程组 每个测试需求的必备组件,是用来模拟用户并发 ...
- CodeForces 70
题目 A题 #include<bits/stdc++.h> using namespace std; int n,b,sum; int main(){ scanf("%d&quo ...
- bzoj2253 纸箱堆叠
题目链接 题意 求三元组的严格上升子序列 思路 先考虑暴力\(dp\)一下 for(int i = 1;i <= n;++i) for(int j = 1;j < i;++j) if(x[ ...
- 前端工程师必须要知道的HTTP部分
1. IETF组织制定的标准 rfc7234: https://tools.ietf.org/html/rfc7234 --- 原来的2616以被废弃 2. 格式 HTTP分为 请求Request 和 ...
- JAVA字符串
字符串 1. 字符串 1.1 字符串概述和特点 java.lang.String类代表字符串. API当中说:Java 程序中的所有字符串字面值(如 "abc" )都作为此类的 ...
- Beamer制作索引
\documentclass{beamer} \usepackage{multicol} \usepackage{makeidx} \newenvironment{theindex}{% \let\i ...
- JavaScript事件的属性列表
HTML 4.0 的新特性之一是能够使 HTML 事件触发浏览器中的行为,比如当用户点击某个 HTML 元素时启动一段 JavaScript.下面是一个属性列表,可将之插入 HTML 标签以定义事件的 ...
- .net 委托多线程 实时更新界面
Thread thread = new Thread(() => { button2.Invoke(new EventHandler(delegate { button2.Enabled = t ...