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 实现 动态规划 /斐波那契数列的更多相关文章

  1. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Python与Go斐波那契数列

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 斐波那契数列 def fibonacci_sequence(num): aa = 0 b = 1 li ...

  3. python练习:斐波那契数列的递归实现

    python练习:斐波那契数列的递归实现 重难点:递归的是实现 def fib(n): if n==0 or n==1: return 1 else: return fib(n-1)+fib(n-2) ...

  4. 如何使用Python输出一个[斐波那契数列]

    如何使用Python输出一个[斐波那契数列]Fibonacci 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonac ...

  5. Python递归及斐波那契数列

    递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...

  6. Python递归函数与斐波那契数列

    定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 阶乘实例 n = int(input(">>:")) def f(n): s ...

  7. python练习题-打印斐波拉契数列前n项

    打印斐波拉契数列前n项 #encoding=utf-8 def fibs(num):    result =[0,1]    for i in range(num-2):        result. ...

  8. Python练习笔记——斐波那契数列

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...

  9. Python生成器实现斐波那契数列

    比如,斐波那契数列:1,1,2,3,5,8,13,21,34.... 用列表生成式写不出来,但是我们可以用函数把它打印出来: def fib(number): n, a, b = 0, 0, 1 wh ...

随机推荐

  1. Elasticsearch6.5.2 X-pack破解及安装教程

    先正常安装 elasticSearch, kibana. 1. 如果是6.5.2版本,可以直接下载jar文件:https://download.csdn.net/download/bigben0123 ...

  2. 2018-2019-2 20175209 实验一《Java开发环境的熟悉》实验报告

    2018-2019-2 20175209 实验一<Java开发环境的熟悉>实验报告 一.实验内容及步骤 1.使用JDK编译.运行简单的Java程序 cd 20175209进入2017520 ...

  3. php运行出现Call to undefined function curl_init()解决方法

    php运行出现Call to undefined function curl_init() 64位win7/8 下PHP不支持CURL 除了将PHP.ini中的;extension=php_curl. ...

  4. mkdosfs 安装

    title: mkdosfs 安装 tags: linux date: 2018/12/21/ 10:00:55 --- mkdosfs 安装 下载dosfstools_2.11.orig.tar.g ...

  5. 图解Tomcat类加载机制(阿里面试题)

    Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给 ...

  6. C++回顾day03---<多态>

    一:错误理解下的多态 #include <iostream> using namespace std; class Parent { public: Parent() { cout < ...

  7. 中间件方法必须返回Response对象实例(tp5.1+小程序结合时候出的问题)

    前言:在最近开发小程序通过中间件检查是否携带token时候报的一个错误 解决方法: 根据手册中需要return出去才可以不报错

  8. html - 表单form

    一.表单 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互 表单能够包含input系列标签,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含textarea.select. ...

  9. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

  10. vue中使用swiper-slide时,循环轮播失效?

    前言 vue 项目中使用时,组件swiper-slide 如果用v-for循环的话,loop:true 就不能无缝轮播,每次轮播到最后一张就停止了??? 正文 代码如下: <swiper :op ...