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错误处理详解
Sep 28 Python
Python内置函数delattr的具体用法
Nov 23 Python
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
python实现银联支付和支付宝支付接入
May 07 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 Python
Python 静态方法和类方法实例分析
Nov 21 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
Jun 12 Python
Python tkinter界面实现历史天气查询的示例代码
Aug 23 Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 Python
Python学习之time模块的基本使用
Jan 17 Python
深入理解python多线程编程
Apr 18 Python
Python 中的 copy()和deepcopy()
Nov 07 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的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
浅谈js中的闭包
2015/03/16 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
Python Tkinter基础控件用法
2014/09/03 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
Python实现的简单计算器功能详解
2018/08/25 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
给老婆的道歉信
2015/01/20 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
2016年寒假见闻
2015/10/10 职场文书
初中班主任心得体会
2016/01/07 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js