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中处理异常的教程
May 24 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
python和c语言的主要区别总结
Jul 07 Python
Django和Flask框架优缺点对比
Oct 24 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
Python中logger日志模块详解
Aug 04 Python
python3中数组逆序输出方法
Dec 01 Python
Python第三方库安装缓慢的解决方法
Feb 06 Python
python实现调用摄像头并拍照发邮箱
Apr 27 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
一些常用的php简单命令代码集锦
2007/09/24 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
JavaScript实现大数的运算
2014/11/24 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
js 闭包深入理解与实例分析
2020/03/19 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
Python中optparse模块使用浅析
2015/01/01 Python
python常见的格式化输出小结
2016/12/15 Python
Python中装饰器高级用法详解
2017/12/25 Python
Python常见工厂函数用法示例
2018/03/21 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
python实现Windows电脑定时关机
2018/06/20 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
python自定义时钟类、定时任务类
2021/02/22 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
优秀企业获奖感言
2014/02/01 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
迟到检讨书500字
2014/02/05 职场文书
顶碗少年教学反思
2014/02/21 职场文书
科学发展观演讲稿
2014/09/11 职场文书
资产运营委托书范本
2014/10/16 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
总结Python常用的魔法方法
2021/05/25 Python
React Fragment介绍与使用详解
2021/11/11 Javascript