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访问类中docstring注释的实现方法
May 04 Python
在Django的URLconf中进行函数导入的方法
Jul 18 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
python对象与json相互转换的方法
May 07 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
python的slice notation的特殊用法详解
Dec 27 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
Feb 16 Python
django如何自定义manage.py管理命令
Apr 27 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
PHP之COOKIE支持详解
2010/09/20 PHP
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
JavaScript中URL编码函数代码
2011/01/11 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
Angular5集成eventbus的示例代码
2018/07/19 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
python3中str(字符串)的使用教程
2017/03/23 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
pandas Dataframe行列读取的实例
2018/06/08 Python
python for和else语句趣谈
2019/07/02 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
Python用Jira库来操作Jira
2020/12/28 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
设计师个人求职信范文
2014/02/02 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
先进个人申报材料
2014/12/30 职场文书
超市员工辞职信范文
2015/05/12 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
浅谈JS的二进制家族
2021/05/09 Javascript
python+opencv实现视频抽帧示例代码
2021/06/11 Python