定义:递归就是不断分割整体成部分直到可以轻易解决分割出来的部分。

递归表达式三定律:

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)的更多相关文章

  1. python 下的数据结构与算法---1:让一切从无关开始

    这段时间把<Data Structure and Algorithms with python>以及<Problem Solving with  Algorithms and Dat ...

  2. python 下的数据结构与算法---8:哈希一下【dict与set的实现】

    少年,不知道你好记不记得第三篇文章讲python内建数据结构的方法及其时间复杂度时里面关于dict与set的时间复杂度[为何访问元素为O(1)]原理我说后面讲吗?其实就是这篇文章讲啦. 目录: 一:H ...

  3. python 下的数据结构与算法---6:6大排序算法

    顶先最后推荐:哈哈,意思是放到顶部强调其重要性,但是应该我总结的六种算法看完了后再看的一篇醍醐灌顶的文章 一:冒泡排序(Bubble Sort) 原理:假设有n个数,第一轮时:从第一个元素开始,与相邻 ...

  4. python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表

    目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...

  5. python 下的数据结构与算法---3:python内建数据结构的方法及其时间复杂度

    目录 一:python内部数据类型分类 二:各数据结构 一:python内部数据类型分类 这里有个很重要的东西要先提醒注意一下:原子性数据类型和非原子性数据类型的区别 Python内部数据从某种形式上 ...

  6. python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表

    目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...

  7. python 下的数据结构与算法---7:查找

    一:线性查找(Sequential Search) 线性查找可以说是我们用的最早也会是用的最多的查找方式了.其对应的是线性数据结构,回顾一下线性数据结构,其特点是先后加入的元素是有顺序的,相邻的.而线 ...

  8. Python实现的数据结构与算法之队列详解

    本文实例讲述了Python实现的数据结构与算法之队列.分享给大家供大家参考.具体分析如下: 一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操 ...

  9. 用Python实现的数据结构与算法:开篇

    一.概述 用Python实现的数据结构与算法 涵盖了常用的数据结构与算法(全部由Python语言实现),是 Problem Solving with Algorithms and Data Struc ...

随机推荐

  1. pydev新工程

    http://www.cnblogs.com/linjiqin/p/3595891.html 明天再编辑一下

  2. SQL Server 2008 查询所有用户表

    SQL Server 2008 查询所有用户表的T-SQL语句是: SELECT * FROM sysobjects WHERE [xtype] = 'U' 或者是: SELECT * FROM sy ...

  3. 多线程08-Callable和Future

    1.简介 Callable是一个接口,与Runnable类似,包含一个必须实现的call方法,可以启动为让另一个线程来执行,执行Callable可以得到一个Future对象 该对象可以监听Callab ...

  4. jQuery的remove和detach的区别

    1.remove([expr])   概述:从DOM中删除所有匹配的元素. 这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素.但除了这个元素本身得以保留之外,其他的 ...

  5. phpstorm 2016.1注册码

    phper 享受生产PHP Web开发phpStorm.利用深代码理解,一流的编码的援助,并支持所有主要的工具和框架. 先看看 phpstorm 2016.1 带来那些新变化呢? 1,更好的PHP语言 ...

  6. range与xrange

    range与xrange的用法是完全相同的,不同的是返回结果不同:range返回的是一个list,而xrange返回的是一个生成器.可以来看下 print type(range(5)) print t ...

  7. 转:BZERO()等的区别

    BZERO()等的区别 bzero  原型: extern void bzero(void *s, int n); 用法: #include <string.h> 功能:置字节字符串s的前 ...

  8. 转:VC中UpdateData()函数的使用

    VC中UpdateData()函数的使用 UpdateData(FALSE)与UpdateData(TRUE)是相反的过程     UpdateData(FALSE)是把程序中改变的值更新到控件中去  ...

  9. 8.2.1.8 IS NULL Optimization NULL 优化:

    8.2.1.8 IS NULL Optimization NULL 优化: Oracle 对待null值: SQL> create table t100(id int,name char(10) ...

  10. BZOJ3401: [Usaco2009 Mar]Look Up 仰望

    3401: [Usaco2009 Mar]Look Up 仰望 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 87  Solved: 58[Submit ...