python---复杂度、斐波那切数列、汉诺塔
时间复杂度
用来估计算法运行时间的一个式子.
一般来说, 时间复杂度高的算法比复杂度低的算法慢.
常见的时间复杂度:
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---复杂度、斐波那切数列、汉诺塔的更多相关文章
- Python迭代器(斐波拉切数列实例)
将一个容器通过iter()函数处理后,就变成了迭代器.迭代器有2个魔法方法__iter__.__next__,一个迭代器必须实现__iter__,这个方法实际上是返回迭代器本身(return self ...
- 【python】递归(阶乘、斐波纳契、汉诺塔)
- 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 实现 动态规划 /斐波那契数列
1.斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数 ...
- Python递归函数与斐波那契数列
定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 阶乘实例 n = int(input(">>:")) def f(n): s ...
- Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
最关键的一点就是 f[ 0 ] * a[ 0 ] + f[ 1 ] * a[ 1 ] + ... + f[ n - 1] * a[ n - 1] f[ 1 ] * a[ 0 ] + f[ 2 ] * ...
随机推荐
- phpStudy windows服务器下安装,以及外网不能访问的问题
废话不多说,超简单 1.下载phpstudy软件包http://phpstudy.php.cn/官网进行下载 2.安装,下一步式傻瓜安装 3.配置域名: 打开hosts文件,添加 然后然后访问域名就可 ...
- 面板Panel
面板 主要步骤: 1.new一个frame窗口 格式 Frame frame = new Frame() 2.设置窗口的大小.位置.可见性 3.设置frame窗口的布局格式(分为流式布局,东西南北中, ...
- 自定义 Django admin 组件
摘要:学习 Django admin 组件,仿照源码的逻辑,自定义了一个简易的 stark 组件,实现类似 admin 的功能. 可自动生成 url 路由,对于model 有与之相应的配置类对象,可进 ...
- Python_Learn,Python背景的介绍
一.计算机程序的运行方式 机器语言编写的程序可以在计算机上直接运行,而汇编语言和高级余语言写的程序(通常称为源程序)则需要"翻译"成机器语言才能运行.源程序"翻译&quo ...
- 【Ansible】ansible容器学习环境搭建
想要学习ansible,只有一个节点肯定是不行的,而搭建虚拟机又是一件非常费时费力费资源的事情,所以通过docker 快速搭建一个容器学习环境是一个不错的选择 1. 了解ansible部署 1.1 需 ...
- 序列化接口的id有什么用?
反序列化Java对象时必须提供该对象的class文件,现在的问题是随着项目的升级,系统的class文件也会升级,Java如何保证两个class文件的兼容性? Java序列化机制允许为序列化类提供一个p ...
- 是否使用过 Redis 集群,集群的原理是什么?
1).Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为 master,继续提供服务. 2).Redis Cluster 着眼于扩展性,在单个 redis ...
- java-iov概念
Ioc-Inversion of Control 即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
- 学习openstack(三)
一.OpenStack初探 1.1 OpenStack简介 OpenStack是一整套开源软件项目的综合,它允许企业或服务提供者建立.运行自己的云计算和存储设施.Rackspace与NASA是最初 ...
- 插值方法 - Newton向前向后等距插值
通常我们在求插值节点的开头部分插值点附近函数值时,使用Newton前插公式:求插值节点的末尾部分插值点附近函数值时,使用Newton后插公式. 代码: 1 # -*- coding: utf-8 -* ...