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读写ini文件示例(python读写文件)
Mar 25 Python
跟老齐学Python之永远强大的函数
Sep 14 Python
python统计一个文本中重复行数的方法
Nov 19 Python
使用python遍历指定城市的一周气温
Mar 31 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
Python数据类型之Number数字操作实例详解
May 08 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
Python字典取键、值对的方法步骤
Sep 30 Python
python 获取字典键值对的实现
Nov 12 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
如何利用Python实现一个论文降重工具
Jul 09 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
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
JS功能代码集锦
2016/05/04 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
Python程序设计入门(1)基本语法简介
2014/06/13 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Pytorch释放显存占用方式
2020/01/13 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
Servlet方面面试题
2016/09/28 面试题
大学优秀班主任事迹材料
2014/05/02 职场文书
法院信息化建设方案
2014/05/21 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
2015大一新生军训感言
2015/08/01 职场文书
实验室安全管理制度
2015/08/05 职场文书