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 ...
随机推荐
- Elasticsearch6.5.2 X-pack破解及安装教程
先正常安装 elasticSearch, kibana. 1. 如果是6.5.2版本,可以直接下载jar文件:https://download.csdn.net/download/bigben0123 ...
- 2018-2019-2 20175209 实验一《Java开发环境的熟悉》实验报告
2018-2019-2 20175209 实验一<Java开发环境的熟悉>实验报告 一.实验内容及步骤 1.使用JDK编译.运行简单的Java程序 cd 20175209进入2017520 ...
- php运行出现Call to undefined function curl_init()解决方法
php运行出现Call to undefined function curl_init() 64位win7/8 下PHP不支持CURL 除了将PHP.ini中的;extension=php_curl. ...
- mkdosfs 安装
title: mkdosfs 安装 tags: linux date: 2018/12/21/ 10:00:55 --- mkdosfs 安装 下载dosfstools_2.11.orig.tar.g ...
- 图解Tomcat类加载机制(阿里面试题)
Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给 ...
- C++回顾day03---<多态>
一:错误理解下的多态 #include <iostream> using namespace std; class Parent { public: Parent() { cout < ...
- 中间件方法必须返回Response对象实例(tp5.1+小程序结合时候出的问题)
前言:在最近开发小程序通过中间件检查是否携带token时候报的一个错误 解决方法: 根据手册中需要return出去才可以不报错
- html - 表单form
一.表单 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互 表单能够包含input系列标签,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含textarea.select. ...
- Codeforces 1096F(dp + 树状数组)
题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...
- vue中使用swiper-slide时,循环轮播失效?
前言 vue 项目中使用时,组件swiper-slide 如果用v-for循环的话,loop:true 就不能无缝轮播,每次轮播到最后一张就停止了??? 正文 代码如下: <swiper :op ...