时间复杂度

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

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

常见的时间复杂度:

​ 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. IDEA连接Gitee

    1.gitee 1.公钥配置 公钥的作用:身份验证,免去每次提交或拉去的登录操作. 1.安装git --> 鼠标右键 --> Git Bash Here -->进入命令窗口 命令一: ...

  2. Python入门随记(4)

    在涉及一些实际问题,会碰到概率论等相关领域的知识,自然少不了矩阵运算,以下是Python中关于矩阵的简单操作: 1.常用库numpy import numpy as np 2.随机生成矩阵 a=np. ...

  3. jdbc.properties/(驱动、URL、用户名、密码)跟换数据库时改该配置文件/Untitled Text File格式

    背景:这几天从阿里云上面购买了云服务器,最垃圾的那种,还送oss和EDS数据库服务器,只不过EDS数据库服务器只有一个月的,就主动升级为一年的,49还是59忘了.对于配置这种EDS过程中,产生的一个念 ...

  4. jsp安全问题及其解决建议

    jsp编程语言自从推出之日起,由于它的快速.平台无关.可扩展.面向对象等特性得到了越来越广泛的应用,越来越多的厂家开发出了各种各样的支持平台如IBM 公司的WebSphere.BEA公司的WebLog ...

  5. Java基础——StringBuilder的添加与反转方法

    StringBuilder添加与反转方法 方法 返回对象 public StringBuilder append(任意类型) 添加任意参数数据,并返回对象本身,注意:返回的是对象本身,则调用过appe ...

  6. java对xml文件的操作

    xml文件格式(示例): <?xml version="1.0" encoding="UTF-8"?> <root> <Funct ...

  7. 74CMS 3.0任意文件写入漏洞

    一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.因为74CMS3.0源代码编辑使用GBK编 ...

  8. 域渗透 | kerberos认证及过程中产生的攻击

    ​文章首发于公众号<Z2O安全攻防>​ 直接公众号文章复制过来的,排版可能有点乱, 可以去公众号看. https://mp.weixin.qq.com/s/WMGkQoMnQdyG8UmS ...

  9. 压测工具 jmeter入门教程及汉化修改

    Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件.相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工 ...

  10. 为什么不建议使用统配符初始化 css 样式

    为什么不建议使用统配符初始化 css 样式 * { padding:0; margin:0; } 采用这样的写法好处是写起来很简单,但是通配符,需要把所有的标签都遍历一遍,当网站较大时,样式比较多,这 ...