目录 :

一、递归的简介

二、递归的经典应用

2.1 递归求阶乘

2.2 递归推斐波那契数列

2.3 二分法找有序列表指定值

2.4 递归解汉诺塔

前言:

当我们碰到诸如需要求阶乘或斐波那契数列的问题时,使用普通的循环往往比较麻烦,但如果我们使用递归时,会简单许多,起到事半功倍的效果。这篇文章主要和大家分享一些和递归有关的经典案例,结合一些资料谈一下个人的理解,也借此加深自己对递归的理解和掌握一些递归基础的用法。

一、递归的简介

1、递归的百度百科定义

程序调用自身的编程技巧称为递归( recursion)。

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或

间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题

来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进

段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

2、递归的通俗理解

递归就是在函数内部调用自己的函数被称之为递归。

3、几个关于递归通俗的比喻

1、我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。

2、一个小朋友坐在第10排,他的作业本被小组长扔到了第1排,小朋友要拿回他的作业本,可以怎么办?他可以拍拍第9排小朋友,说:“帮我拿第1排的本子”,而第9排的小朋友可以拍拍第8排小朋友,说:“帮我拿第1排的本子”...如此下去,消息终于传到了第1排小朋友那里,于是他把本子递给第2排,第2排又递给第3排...终于,本子到手啦!这就是递归,拍拍小朋友的背可以类比函数调用,而小朋友们都记得要传消息、送本子,是因为他们有记忆力,这可以类比栈。

3、 一个洋葱是一个带着一层洋葱皮的洋葱。

我想到一个比较接近我们生活的例子,和那个传本子的例子类似,比如你喜欢一个女孩,你想告诉她,但你和她座位隔得很远,你写好了纸条,想同学传过去,于是,你把纸条传给你前面的同学,然后同学又向前传,直到传到你喜欢的那个女孩手里,但是女孩已经有喜欢的人了,于是,她也写了一个纸条让原来的同学再传回来给你,那么同学之间打招呼传纸条的行为就可以看作是函数调用,你是最初调用的函数,那个你喜欢的女孩就是最终的目的地,纸条上的信息就是初始值和最终答案。

4、最简单的递归的实例

#-*- coding:utf-8-*-#将 10不断除以2,直至商为0,输出这个过程中每次得到的商的值。

defrecursion(n):

v= n//2 #地板除,保留整数

print(v) #每次求商,输出商的值

if v==0:'''当商为0时,停止,返回Done'''

return 'Done'v= recursion(v) #递归调用,函数内自己调用自己

recursion(10) #函数调用

输出结果:

5

2

10

5、递归的特点

通过以上的介绍,我们大致可以总结出递归的以下几个特点:

1、必须有一个明确的结束条件2、每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

关于递归还有两个名词,可以概括递归实现的过程

递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推

回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯

二、递归经典案例

1、递归求阶乘

实例如下:

#1!+2!+3!+4!+5!+...+n!

deffactorial(n):'''n表示要求的数的阶乘'''

if n==1:return n #阶乘为1的时候,结果为1,返回结果并退出

n = n*factorial(n-1) #n! = n*(n-1)!

return n #返回结果并退出

res = factorial(5) #调用函数,并将返回的结果赋给res

print(res) #打印结果

2、递归推斐波那契数列

实例如下:

#1,1,2,3,5,8,13,21,34,55,试判断数列第十五个数是哪个?

deffabonacci(n):'''n为斐波那契数列'''

if n <= 2:'''数列前两个数都是1'''v= 1

return v #返回结果,并结束函数

v = fabonacci(n-1)+fabonacci(n-2) #由数据的规律可知,第三个数的结果都是前两个数之和,所以进行递归叠加

return v #返回结果,并结束函数

print(fabonacci(15)) #610 调用函数并打印结果

3、二分法找有序列表指定值

实例如下:

data = [1,3,6,13,56,123,345,1024,3223,6688]defdichotomy(min,max,d,n):'''min表示有序列表头部索引

max表示有序列表尾部索引

d表示有序列表

n表示需要寻找的元素'''mid= (min+max)//2

if mid==0:return 'None'

elif d[mid]n:print('向左侧找!')returndichotomy(min,mid,d,n)else:print('找到了%s'%d[mid])returnres= dichotomy(0,len(data),data,222)print(res)

未完待续。。。

python经典案例-Python递归的经典案例相关推荐

  1. 想轻松入门Python编程,这10个经典案例你还不知道嘛?

    一直以来,Python都是一门很简单的编程语言,其实无论你有没有基础,学起来都不难. 但,必须有方法,而最好的方法其实就是学+练,即:基本常识+这10经典案例. 而同时有着系统的Python基础知识点 ...

  2. Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略

    Python:利用python语言绘制多个子图经典案例.代码实现之详细攻略 目录 利用python语言绘制多个子图代码实现.经典案例 1.绘制多个子图框架 多个子图绘制的经典案例 1.绘制多个直方图 ...

  3. python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例

    Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...

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

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

  5. 87-Java方法递归形式、算法流程总结、递归常见案例、递归经典案例-猴子吃桃问题、非规律化递归案例-文件搜索、啤酒问题

    方法递归 一.递归的形式和特点 1.什么是方法递归? 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion). 递归作为一种算法在程序设计语言中广泛应用. 2.递归的形式 直接递归: ...

  6. python经典好书-Python 必读好书,这十本分量十足!

    最大买书折扣,<Python与算法社区>粉丝专属!!! 感谢图灵出版社为我们提供的福利,我从海量Python图书中精挑细选了10本 Python完整技术栈相关的书籍.读书,只读好书,经典好 ...

  7. python自动化办公实战案例,python 自动化办公 案例

    推荐几个适合新手练手的Python项目 谷歌人工智能写作项目:小发猫 python编程:输入一个自然数n,如果n为奇数,输出表达式1+1/3+-+1/n的值 def summ(n): if n%2: ...

  8. python经典好书-python经典书籍推荐

    互动出版网python书籍专区.为您推荐python经典书籍,学习python程序语言必读经典之作.以及关于python经典教材. 本书包括python程序设计的方方面面,首先从python的安装开始 ...

  9. python决策树分类案例_银行产品销售案例与决策树分类算法

    案例数据集来源于UCI网站.案例是基于一家葡萄牙金融机构的电话销售数据.营销目标是确认客户是否愿意认购银行发行的一款定期储蓄产品.该数据集内包含41188条记录和20个特征变量,和1个分类变量.变量包 ...

最新文章

  1. 【对讲机的那点事】关于对讲机锂电池你了解多少?
  2. top中的res只增不减_tensorflow中张量排序与accuracy计算
  3. boost::core::is_same用法测试实例
  4. 腾讯Angel成世界顶级AI项目!中国首个从LF AI基金会的毕业项目
  5. mysql行级锁升级_mysql innodb 行级锁升级
  6. 需求调研报告模板_2020年工业软管行业深度市场调研及投资策略建议报告-液体化学品增加对其需求...
  7. 27岁到来之际,我在大厂实现了年薪40W+的小目标
  8. IDM下载百度资源出现403的解决方法
  9. 纸壳cms php,纸壳CMS 3.4 发布,电商功能增强
  10. Bartender软件使用VB判断条件并返回值
  11. Mysql之DDL(数据定义语言)
  12. unity简单的脚本 播放3D立体音效(近大远小效果)
  13. bwa mem 报错处理:[mem_sam_pe] paired reads have different names
  14. Oracle 递归查询SQL
  15. 以太坊:在合约里调用指定地址的另一已部署合约
  16. wps时间戳转换成日期
  17. 安装系统时,硬盘格式转换
  18. QGIS常用图源(谷歌中国、mapbox、esri、天地图等)(weixin公众号【图说GIS】)
  19. 红米note5linux刷机包_Android 红米Note5 刷机魔趣系统
  20. 转载:深入研究simulink建模与仿真之输入端口模块(Inport)的几种不同的图标

热门文章

  1. 消息 35371-聚集列存储索引
  2. centos6下的mysql的安装
  3. Java那些事之多线程
  4. ASP.NET之间数据的传递(未完)
  5. windows查看端口占用的进程和杀死进程
  6. char nchar varchar nvarchar varchar2区别
  7. python第二天练习题
  8. 伏威谈淘宝网的高并发处理与压力测试(转)
  9. matlab 最小一乘法,MATLAB实现最小二乘法
  10. python快速编程入门第13章-Python快速编程入门,打牢基础必须知道的11个知识点...