时间复杂度

​ 用来估计算法运行时间的一个式子.

​ 一般来说, 时间复杂度高的算法比复杂度低的算法慢.

常见的时间复杂度:

​ O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n2logn) < O(n3)

快速判断时间复杂度

​ 循环减半的过程---> O(logn)

​ 几层循环就是n的几次方的复杂度

空间复杂度

​ 用来评估算法内存占用大小的一个式子

​ 空间可以换时间

递归

递归的两个特点

​ 调用自身

​ 终止条件

斐波那切数列

​ 1 1 2 3 5 8 ........

# 计算函数运行时间的装饰器
from cal_time import get_running_time ### 第一种
def fibonacci(n):
if n == 0 or n == 1:
return 1
else:
for i in range(2, n + 1):
return fibonacci(n - 1) + fibonacci(n - 2) # 给递归函数加装饰器, 需要套一个外壳
@get_running_time
def fib1(n): # 存在重复计算, 效率慢
return fibonacci(n) print(fib1(30)) ### 第二种
@get_running_time
def fib2(n):
li = [1, 1]
if n == 0 or n == 1:
return 1
else:
for i in range(2, n + 1):
li.append(li[-1] + li[-2]) return li[n] print(fib2(30000)) ### 第三种
@get_running_time
def fib3(n):
a = 1
b = 1
c = 1 for i in range(2, n + 1):
c = a + b
a = b
b = c return c print(fib3(30000)) # The fib1 running time is 1.0533857345581055
# 1346269 # The fib2 running time is 0.0519812107086182 # The fib3 running time is 0.0130012035369873

汉诺塔问题

问题描述

​ 有三根柱子, 其中一根柱子上, 从下往上按照大小顺序摞着n个圆盘, 把按照大小顺序重新摆放到另一根柱子上

要求

​ 小圆盘上不能放置大圆盘, 在三根柱子之间一次只能移动一个圆盘.

分析

​ n个圆盘时

​ (1) 把n-1个圆盘从A经过C移动到B

​ (2) 把第n圆盘从A移动到C

​ (3) 把n-1个圆盘从B经过A移动到C

​ 故汉诺塔移动次数的递推式: h(n) = 2h(n-1) + 1

count = 0

def hanoi(n, a, b, c):
""" :param n: n个圆盘
:param a: 出发的柱子a
:param b: 经过的柱子b
:param c: 到达的柱子c
:return:
""" if n > 0:
hanoi(n - 1, a, c, b)
print('{}->{}'.format(a, c))
global count
count += 1
hanoi(n - 1, b, a, c) n = 3
hanoi(n, 'A', 'B', 'C')
print('{}个圆盘时, 汉诺塔移动次数: {}'.format(n, count)

python---复杂度、斐波那切数列、汉诺塔的更多相关文章

  1. Python迭代器(斐波拉切数列实例)

    将一个容器通过iter()函数处理后,就变成了迭代器.迭代器有2个魔法方法__iter__.__next__,一个迭代器必须实现__iter__,这个方法实际上是返回迭代器本身(return self ...

  2. 【python】递归(阶乘、斐波纳契、汉诺塔)

  3. Python与Go斐波那契数列

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

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

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

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

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

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

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

  7. Python 实现 动态规划 /斐波那契数列

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

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

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

  9. Codeforces 316E3 线段树 + 斐波那切数列 (看题解)

    最关键的一点就是 f[ 0 ] * a[ 0 ] + f[ 1 ] * a[ 1 ] + ... + f[ n - 1] * a[ n  - 1] f[ 1 ] * a[ 0 ] + f[ 2 ] * ...

随机推荐

  1. Numpy库基础___三

    ndarray一个强大的N维数组对象Array •ndarray的操作 索引 a = np.arange(24).reshape((2,3,4)) print(a) #[[[ 0 1 2 3] # [ ...

  2. 阿里云镜像站DNS——Chrome配置方法

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 DNS 简介 域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送. 阿 ...

  3. Arch Linux 系统迁移

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 备份 Arch Linux 系统 安装 pigz 使用 pigz 多线程压缩比使用 tar 单线程压缩速度明显提升多倍 sudo pacman ...

  4. TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手

    TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...

  5. python编程笔记--字符编码

    ASCII码.Unicode.utf-8 ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电 ...

  6. Sting -- byte[]互转

    1.String -->byte[] String str = "中国"; byte[] bys = str.getBytes(); Arrays.toString(bys) ...

  7. phptorm 集成git和gitlab和一些命令

    mac: 2.phpstorm->csv->create git... 3.命令:ssh-keygen -t rsa -C"your_email@youremail.com&qu ...

  8. java-开发规约

    public class TenTen { /** * 代码中的命名不能用下划线或美元符号开始和结束:例如 _name name_ $name name$ */ /** * 类名必须使用UpperCa ...

  9. @Autowired 注解 ?

    @Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配. 它的用法和@Required 一样,修饰 setter 方法.构造器.属性或者具有任意名称 和/或多个参数的 PN 方 ...

  10. 学习Apache(五)

     apache目前主要有两种模式:prefork模式和worker模式: 1)prefork模式(默认模式) prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程 ...