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 multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
python3.5仿微软计算器程序
Mar 30 Python
python处理html转义字符的方法详解
Jul 01 Python
python实现requests发送/上传多个文件的示例
Jun 04 Python
基于python指定包的安装路径方法
Oct 27 Python
python实现嵌套列表平铺的两种方法
Nov 08 Python
python抓取搜狗微信公众号文章
Apr 01 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
python 将视频 通过视频帧转换成时间实例
Apr 23 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
解决python存数据库速度太慢的问题
Apr 23 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函数的实现原理及性能分析(二)
2015/05/13 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
javascript与CSS复习(三)
2010/06/29 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
python实现rest请求api示例
2014/04/22 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python while true实现爬虫定时任务
2020/06/08 Python
Python自带的IDE在哪里
2020/07/01 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
环境工程专业自荐信范文
2014/03/18 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
2014年妇联工作总结
2014/11/21 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技