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 list中append()与extend()用法分享
Mar 24 Python
Pyramid添加Middleware的方法实例
Nov 27 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
python图像处理之镜像实现方法
May 30 Python
取numpy数组的某几行某几列方法
Apr 03 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
Jul 05 Python
Django 模型类(models.py)的定义详解
Jul 19 Python
更新pip3与pyttsx3文字语音转换的实现方法
Aug 08 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
Python 实现集合Set的示例
Dec 21 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 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使用数组实现队列
2012/02/05 PHP
PHP 快速排序算法详解
2014/11/10 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
有关javascript的性能优化 (repaint和reflow)
2013/04/12 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
理解JS事件循环
2016/01/07 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
2016/05/10 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
Python连接Redis的基本配置方法
2018/09/13 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
母亲七十大寿答谢词
2014/01/18 职场文书
质检部经理岗位职责
2014/02/19 职场文书
就业推荐表导师评语
2014/12/31 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
学习经验交流会策划书
2015/11/02 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python