Python进阶之递归函数的用法及其示例


Posted in Python onJanuary 31, 2018

作者是一名沉迷于Python无法自拔的蛇友,为提高水平,把Python的重点和有趣的实例发在简书上。

一、递归

是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。

(来源于百度,看不懂正常,术语就是不说人话)

下面是笔者的个人理解:递归就是在函数内部调用自己的函数被称之为递归。

看不懂?形象的举几个例子!

  1. 一个洋葱是一个带着一层洋葱皮的洋葱。
  2. 递归就是包子馅的包子,它的极限是馒头。

真的形象!有点扯远了...言归正传,下面我们通过递归来理解递归!

二、实例

#直接调用自己:
def func():
  print('from func')
  func()

func()
#间接调用自己
def foo():
  print('from foo')
  bar()

def bar():
  print('from bar')
  foo()

foo()
#递归的实现:
def age(n):
  if n == 1:
    return 18
  return age(n-1)+2

print(age(5))

# age(5)=age(4)+2 第一次进入
# age(4)=age(3)+2 第二次进入
# age(3)=age(2)+2 第三次进入
# age(2)=age(1)+2 第四次进入
# age(1)=18 第五次进入,最后判断终止条件

# age(n)=age(n-1)+2 #n>1 递归终止条件
# age(1)=18 #n=1     等于终止条件

三、递归的回溯与递推

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

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

# 实例
l =[1, 2, [3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15,[16,[17,]],19]]]]]]]

def search(l):
  for item in l:
    if type(item) is list:
      search(item)
    else:
      print(item)

search(l)

三、实例代码

阶乘

def fact(n):
  if n==1:
    return 1
  return n * fact(n -1)

上面就是一个实现阶层的递归函数,我们来试一试。

>>> fact(1)
1
>>> fact(5)
120
>>>fact(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

可能有点懵吧,来看一看计算过程吧:

===> fact(5)

===> 5 * fact(4)

===> 5 * (4 * fact(3))

===> 5 * (4 * (3 * fact(2)))

===> 5 * (4 * (3 * (2 * fact(1))))

===> 5 * (4 * (3 * (2 * 1)))

===> 5 * (4 * (3 * 2))

===> 5 * (4 * 6)

===> 5 * 24

===> 120

斐波那契数列

def fib(n):
  if n <2:
     return n
  else:
    return fib(n -1) + fib(n -2)

这个不难,还是去看下一个例子吧!

汉诺塔

def hanoti(n,x1,x2,x3):
  if(n == 1):
    print('move:',x1,'-->',x3)
    return
  hanoti(n-1,x1,x3,x2)
  print('move:',x1,'-->',x3)
  hanoti(n-1,x2,x1,x3)

哈哈,肯定看不懂吧,没事,看看流程图,你会豁然开朗~

Python进阶之递归函数的用法及其示例

总结

以上就是笔者为大家总结的关于Python递归的内容,希望大家能够喜欢~也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python中的条件判断语句
May 14 Python
Python实现完整的事务操作示例
Jun 20 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
Apr 22 Python
python处理csv中的空值方法
Jun 22 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 Python
Python爬虫与反爬虫大战
Jul 30 Python
Python连接Impala实现步骤解析
Aug 04 Python
python 提取html文本的方法
May 20 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
May 28 Python
七个非常实用的Python工具包总结
Jun 15 Python
Python tkinter事件高级用法实例
Jan 31 #Python
pyqt5自定义信号实例解析
Jan 31 #Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 #Python
pyqt5简介及安装方法介绍
Jan 31 #Python
Python实现的圆形绘制(画圆)示例
Jan 31 #Python
Python Json序列化与反序列化的示例
Jan 31 #Python
Python实现JSON反序列化类对象的示例
Jan 31 #Python
You might like
模仿OSO的论坛(五)
2006/10/09 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
python调用cmd命令行制作刷博器
2014/01/13 Python
Python中的迭代器漫谈
2015/02/03 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
Python内存读写操作示例
2018/07/18 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
高中生自我鉴定范文
2013/10/30 职场文书
应届生学校辅导员求职信
2013/11/07 职场文书
外语学院毕业生的自我鉴定
2013/11/28 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
敬老院标语
2014/06/27 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang