递归算法

1、递归的定义 
递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。 
递归常与分治思想同时使用,能产生许多高校的算法。递归常用来解决结构相似的问题。所谓结构相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小,并且依赖第一部分的结果。。实际上,递归是把一个不能或不好解决的大问题转化成一个或几个小问题,再把这些小问题进一步分解成更小的小问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素: 
(1) 边界条件:确定递归到何时终止,也称为递归出口。 
(2) 递归模式:大问题是如何分解为小问题的,也称为递归体。 
递归函数只有具备了这两个要素,才能在有限次计算后得出结果。 
2、递归算法实例

2.1求一个整数n的阶乘 
阶乘的定义如下图:

根据阶乘的递归定义,很容易就能写出求阶乘的递归算法。

def factorial(n) :if n == 1 :return 1         #递归结束return n * factorial(n - 1)  #问题规模减1,递归调用

2.2汉诺塔 
汉诺塔问题是递归函数的经典应用,它来自一个古老传说:在世界刚被创建的时候有一座钻石宝塔A,其上有64个金蝶。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔B和C。从世界创始之日起,波罗门的牧师就一直在试图把塔A上的碟子移动到C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成这个任务时,世界末日也就到了。 
对于汉诺塔问题的求解,可以通过以下3步实现: 
(1)将塔A上的n -1个碟子借助C塔先移动到B塔上; 
(2)把塔A上剩下的一个碟子移动到塔C上; 
(3)将n - 1个碟子从B塔借助塔A移动到塔C上。 
很显然,这是一个递归求解的过程,假设碟子数n=3时,汉诺塔问题的求解过程如下图所示:

汉诺塔的递归算法(Python实现):

def Hanoi(n, A, B, C) :if (n == 1) :move(A, c)   #表示只有一个碟子时,直接从A塔移动到C塔else :Hanoi(n - 1, A, C, B)  #将剩下的A塔上的n-1借助C塔移动到B塔move(A, C)              #将A上最后一个直接移动到C塔上Hanoi(n - 1, B, A, C)  #将B塔上的n-1个碟子借助A塔移动到C塔

 

递归函数的运行轨迹 
借助汉诺塔这个实例,来讲解一下递归函数的运行轨迹。在递归函数中,调用函数和被调用函数都是同一个函数,需要注意的是函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之退出i+1层调用应该返回第i层。下图是n=3时汉诺塔算法的运行轨迹,有向弧上的数字表示递归调用和返回的执行顺序。

汉诺塔的递归算法代码实现:

#coding=utf-8

i = 1
def move(n, mfrom, mto) :global iprint "第%d步:将%d号盘子从%s -> %s" %(i, n, mfrom, mto)i += 1def hanoi(n, A, B, C) :if n == 1 :move(1, A, C)else :hanoi(n - 1, A, C, B) move(n, A, C)    hanoi(n - 1, B, A, C)#********************程序入口**********************
try :n = int(raw_input("please input a integer :"))print "移动步骤如下:"hanoi(n, 'A', 'B', 'C')
except ValueError:print "please input a integer n(n > 0)!" 

 

执行结果: 

2.3 斐波拉契数列 
斐波拉契数列,是这样的一个数列:0、1、1、2、3、5、8、13、21、……。 
斐波拉契数列的核心思想是: 
从第三项起,每一项都等于前两项的和,即F(N) = F(N - 1) + F(N - 2) (N >= 2) 
并且规定F(0) = 0,F(1) = 1

要求:利用递归算法获得指定项的斐波拉契数列。

#!/usr/bin/python
#coding=utf-8
def fib_list(n) :if n == 1 or n == 2 :return 1else :m = fib_list(n - 1) + fib_list(n - 2)return m
print "**********请输入要打印的斐波拉契数列项数n的值***********"
try :n = int(raw_input("enter:"))
except ValueError :print "请输入一个整数!"exit()
list2 = [0]
tmp = 1
while(tmp <= n):list2.append(fib_list(tmp))tmp += 1
print list2

 

执行结果: 

转载于:https://www.cnblogs.com/ne-zha/p/7437159.html

python日记_递归相关推荐

  1. 阿里巴巴400集python教程_递归的练习课程 | Python从入门到精通:高阶篇之十二-阿里云开发者社区...

    上节课留了两个练习,这节课给大家讲一下,同时巩固一下递归的用法. 练习1.创建一个函数 power 来为任意数字做幂运算 n* * i 用数据10^5举例说明一下: # 10 ** 5 = 10 * ...

  2. 量化分析师的python日记_量化分析师的Python日记【第1天:谁来给我讲讲Python?】...

    "谁来给我讲讲Python?" 作为无基础的初学者,只想先大概了解一下Python,随便编个小程序,并能看懂一般的程序,那些什么JAVA啊.C啊.继承啊.异常啊通通不懂怎么办,于是 ...

  3. python递归函数例题_递归案例python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 而对应的中文翻译 "递归" 却表达了两个意思:"递 ...

  4. 汉诺塔python创新设计_递归经典案例汉诺塔 python实现

    最近在廖雪峰大神的教程学习python 学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,因此本人以为能够写篇博客来表达一下本身的看法.这markdown编辑器还不怎么会 ...

  5. python将10到1递减_递归地将列表递减1

    不管怎样,这是学习递归的一种糟糕的方法,因为你用它来做一些本质上不是递归的事情.如果你的老师真的要你写一个程序,让列表中的元素递归地递减,那就让他/她感到羞耻.在 正如Haidro所指出的,解决这个问 ...

  6. python天天向上每十天休息一天_统计师的Python日记【第十天:数据聚合】

    回顾一下: 第1天学习了Python的基本页面.操作,以及几种主要的容器类型. 第2天学习了python的函数.循环和条件.类. 第3天了解了Numpy这个工具库. 第4.5两天掌握了Pandas这个 ...

  7. 最火的python视频_超火Python400集视频,116-248集思维导图视频介绍(第二季)

    第二季 2.1 文件处理 116_file文件操作_操作系统底层关系_写入文件 117_编码知识_中文乱码问题解决 118_关闭流要点1_try异常管理 119_关闭流要点2_with上下文管理_现场 ...

  8. python笔记_第三周

    python笔记_第三周 第十天 回调函数 回调函数就是一个被作为参数传递的函数把函数a当做一个值 赋值给函数b的形参, 在调用函数b的时候 在函数体内 适当的实际调用函数a, 这个函数a就是回调函数 ...

  9. 后序遍历的非递归算法python_刷题系列 - Python用非递归实现二叉树后续遍历

    顺便把Python用非递归实现二叉树后续遍历也写了. 其实前序中序和后续都是针对父节点说的.比如下面这个最简单二叉树. 前序就是ABC,父节点A在前 中序就是BAC,父节点A在中间 后序就是BCA,父 ...

最新文章

  1. iframe批量异步上传图片
  2. 开放下载 | 和 4000+Java 开发者共读《Spring Cloud Alibaba 从入门到实战》
  3. 29个人,耗时84天,硬刚Python,实验结果如下。
  4. 线程同步--关键代码段(二)
  5. 实战中总结出来的CSS常见问题及解决办法
  6. 计算机导航医学应用,计算机导航技术在口腔颌面外科应用中的新发展
  7. Netbackup 一次备份失败原因的总结
  8. 每个字符旋转随机角度的图象验证码 V2.0
  9. [原] 计算机调试管理器服务被禁用的解决方法
  10. pdffactory 打印字体_PdfFactory Pro(PDF虚拟打印软件) 中文版分享
  11. 学习笔记之深入浅出MFC 第5章 Windows程序的生与死
  12. 需求管理系统分析与设计
  13. 广告违规词、敏感词在线检测
  14. RGB转灰度的几种算法
  15. 虚拟机安装CentOs系统
  16. 中文数字文字转换成阿拉伯数字
  17. html1——标题栏logo、网站logo
  18. 【C语言】数组详解,初学者一看就懂
  19. 纽约州立大学环境与林业学院计算机科学专业,纽约州立大学环境与林业学院研究生专业 如何应对严峻的环境污染问题...
  20. ElasticSearch6.5.4快速入门

热门文章

  1. 急诊与灾难医学-重点以及习题
  2. css翘边阴影图片,【CSS】翘边阴影
  3. c/c++ 有n个人围成一圈, 顺序排号。从第1个人开始报数(从1~3报数), 凡报到3的人退出圈子, 问最后留下的人原来排在第几号。
  4. avahi-daemon启动失败-解决方法-linux
  5. zero(全志V3S)-32MB Flash移植
  6. 如果只能从市面上的Python入门书中选择一本送给你,那我一定会选这本……
  7. AI每日小练习之磨砂玻璃质感图标
  8. Python中的array[:]表示什么意思?记录一个幺蛾子
  9. 空气质量预测 灰色预测模型 模糊综合评价模型
  10. 【整理】SIMD、MMX、SSE、AVX、3D Now!、neon——指令集大全