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日志模块logging简介
Apr 13 Python
Python编程入门的一些基本知识
May 13 Python
Python中Random和Math模块学习笔记
May 18 Python
python放大图片和画方格实现算法
Mar 30 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
对python3标准库httpclient的使用详解
Dec 18 Python
Python3最长回文子串算法示例
Mar 04 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
解决Djang2.0.1中的reverse导入失败的问题
Aug 16 Python
python实现一个猜拳游戏
Apr 05 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
Apr 07 Python
Pandas 数据编码的十种方法
Apr 20 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
文章推荐系统(二)
2006/10/09 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
php实现上传图片文件代码
2015/07/19 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
JavaScript表单常用验证集合
2008/01/16 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
2017/06/20 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
Django 实现购物车功能的示例代码
2018/10/08 Python
浅谈python中get pass用法
2019/03/19 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
软件测试常见笔试题
2012/02/04 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
中英文求职信范文
2014/01/27 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
工程进度款催款函
2015/06/24 职场文书
校运会班级霸气口号
2015/12/24 职场文书
学者《孟子》名人名言
2019/08/09 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python