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实现strcmp函数功能示例
Mar 25 Python
Python实现多线程下载文件的代码实例
Jun 01 Python
python实现根据窗口标题调用窗口的方法
Mar 13 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
对numpy中array和asarray的区别详解
Apr 17 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
完美解决ARIMA模型中plot_acf画不出图的问题
Jun 04 Python
python 监控logcat关键字功能
Sep 04 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
Jun 01 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
Memcache 在PHP中的使用技巧
2010/02/08 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
使用PHP编写的SVN类
2013/07/18 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
javascript 获取表单file全路径
2009/12/31 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
Python splitlines使用技巧
2008/09/06 Python
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
python文件操作整理汇总
2014/10/21 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
python版大富翁源代码分享
2018/11/19 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
单位委托书范本
2014/04/04 职场文书
人资专员岗位职责
2014/04/04 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
源码安装apache脚本部署过程详解
2022/09/23 Servers