python 下的数据结构与算法---5:递归(Recursion)
定义:递归就是不断分割整体成部分直到可以轻易解决分割出来的部分。
递归表达式三定律:
1:递归表达式必须有个最小单元 (最小单元既是停止递归调用以及能够直接运算的)
2:递归表达式在运算过程中必须向最小单元移动
3:递归表达式必须递归的调用自己
一:简单实例:
1:求数字数组所有元素的和
def sum(seq=[]):
if len(seq)==1:
return seq[0]
return seq[0]+sum(seq[1:])
print('sum of the list:',sum([1,2,3,4,5,6,7,8,9]))
2:求阶乘
def factorial(n):
if n==1:
return 1
return n*factorial(n-1)
print('10!=',factorial(10))
3:将十进制数转化为任意进制的string型字符串
#回顾一下在讲堆的应用时也实现了类似功能
convert_string = "0123456789ABCDEF"
def to_str(n, base):
global convert_string
if n < base:
return convert_string[n]
else:
return to_str(n//base, base) + convert_string[n % base]
print(to_str(769, 2))
4:反转字符串
def reverse(string):
if len(string)==1:
return str(string)
return str(string[len(string)-1])+reverse(string[:len(string)-1])
print(reverse('string'))
5:汉诺塔问题(hanoi)
问题:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上面有64个盘子,盘子大小不等,大的在下,小的在上。现要求将这64个盘子从A全部移到C上,每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。移动过程中可以利用B座。
注意:下面的实现过程不像上面单独的把最小单元提取出来进行处理与返回,我们知道,最小单元是只有一个盘,直接移动就是了,对应下面当height为1时,此时move_tower(height - 1, from_pole, middle_pole, to_pole)与move_tower(height - 1, middle_pole, to_pole, from_pole)调用时height-1的结果是0,故什么都不返回。
def move_tower(height, from_pole, to_pole, middle_pole):
if height >= 1:
move_tower(height - 1, from_pole, middle_pole, to_pole)
move_disk(from_pole, to_pole)
move_tower(height - 1, middle_pole, to_pole, from_pole)
def move_disk(fp,tp):
print("moving disk from",fp,"to",tp)
move_tower(3, "A", "B", "C")
二:复杂实例之走出迷宫
1:画图之turtle模块
import turtle
my_turtle = turtle.Turtle()
my_win = turtle.Screen()
def draw_spiral(my_turtle, line_len):
if line_len > 0:
my_turtle.forward(line_len)
my_turtle.right(90) #只是转向90°
draw_spiral(my_turtle, line_len - 5)
draw_spiral(my_turtle, 100)
my_win.exitonclick() #点击图像后退出
2:迷宫分析
基本原理:分别按上下左右的顺序来进行迭代行走,一个方向碰壁后进入下一个方向
需叠加:要纪录走过的路,这样避免画圈式死循环
python 下的数据结构与算法---5:递归(Recursion)的更多相关文章
- python 下的数据结构与算法---1:让一切从无关开始
这段时间把<Data Structure and Algorithms with python>以及<Problem Solving with Algorithms and Dat ...
- python 下的数据结构与算法---8:哈希一下【dict与set的实现】
少年,不知道你好记不记得第三篇文章讲python内建数据结构的方法及其时间复杂度时里面关于dict与set的时间复杂度[为何访问元素为O(1)]原理我说后面讲吗?其实就是这篇文章讲啦. 目录: 一:H ...
- python 下的数据结构与算法---6:6大排序算法
顶先最后推荐:哈哈,意思是放到顶部强调其重要性,但是应该我总结的六种算法看完了后再看的一篇醍醐灌顶的文章 一:冒泡排序(Bubble Sort) 原理:假设有n个数,第一轮时:从第一个元素开始,与相邻 ...
- python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表
目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...
- python 下的数据结构与算法---3:python内建数据结构的方法及其时间复杂度
目录 一:python内部数据类型分类 二:各数据结构 一:python内部数据类型分类 这里有个很重要的东西要先提醒注意一下:原子性数据类型和非原子性数据类型的区别 Python内部数据从某种形式上 ...
- python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表
目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...
- python 下的数据结构与算法---7:查找
一:线性查找(Sequential Search) 线性查找可以说是我们用的最早也会是用的最多的查找方式了.其对应的是线性数据结构,回顾一下线性数据结构,其特点是先后加入的元素是有顺序的,相邻的.而线 ...
- Python实现的数据结构与算法之队列详解
本文实例讲述了Python实现的数据结构与算法之队列.分享给大家供大家参考.具体分析如下: 一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操 ...
- 用Python实现的数据结构与算法:开篇
一.概述 用Python实现的数据结构与算法 涵盖了常用的数据结构与算法(全部由Python语言实现),是 Problem Solving with Algorithms and Data Struc ...
随机推荐
- mac brew 安装包下载失败解决
1.FQ或者用别的方式把安装包下载下来 2.查看缓存存储目录 brew --cache 3.将下载的包拷贝到缓存目录中,再此执行安装命令,如果安装还是去下载,检查下缓存目录是否多出一个下载中的文件,将 ...
- java制作简单的坦克大战
坦克大战是我们小时候玩红白机时代的经典游戏,看到有不少小伙伴都使用各种语言实现了一下,手痒痒,也使用java做的一个比较简单的坦克大战,主要面向于学过Java的人群,与学了一段时间的人,有利于面向对象 ...
- QT参考录
源码参考: #include "CServerManager.h" CServerManager* CServerManager::m_pInstance = NULL; CSer ...
- query等待ajax执行完毕再继续执行下面代码的操作
Jquery等待ajax执行完毕再继续执行下面代码的效果,具体代码如下,其实就是将 jquery ajax 函数的 async 参数设置为 false 即可,该参数默认为 true: $(docume ...
- FlowPlayer 参数说明
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> & ...
- IIS6添加5.3.27 /西部数据网站管理助理升级php
下载并安装IIS FastCGI 下载地址:http://www.iis.net/download/fastcgi. 选择 x86或者download x86,下载下来名称为 fcgisetup_1. ...
- python 多层装饰器
25.多层装饰器: 1.原理:执行顺序从上往下,#2和#3组成一个函数假设为nf1,#1和nf1组成一个函数nnf1 f1成为ck_ty_of_us的inner函数即nf ...
- Mongodb增加权限管理
前言: 随着列式存储理念的成熟,越来越多的开发者开始接纳mongodb,hbase这类大储存的分布式列式数据库.特别是mongodb的这种快速搭建,快速使用特点,使其得到更多人的青睐.本人主要通过官 ...
- Swift—扩展声明-备
声明扩展的语法格式如下: extension 类型名 { //添加新功能 } 声明扩展的关键字是extension,“类型名”是Swift中已有的类型,包括类.结构体和枚举,但是我们仍然可以扩展整型. ...
- 系统共享内存的修改(ORA-27102: out of memory)
http://ccchencheng.blog.51cto.com/2419062/738188 http://blog.csdn.net/leshami/article/details/874602 ...