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实现baidu hi自动登录的代码
Feb 10 Python
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
使用Python从有道词典网页获取单词翻译
Jul 03 Python
Python使用getpass库读取密码的示例
Oct 10 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
儿童编程python入门
May 08 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
Django 多环境配置详解
May 14 Python
Django 缓存配置Redis使用详解
Jul 23 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
如何利用python创作字符画
Jun 25 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+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
php中strtotime函数用法详解
2014/11/15 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Python3实现生成随机密码的方法
2014/08/23 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python自然语言编码转换模块codecs介绍
2015/04/08 Python
python中while循环语句用法简单实例
2015/05/07 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
考博自荐信
2013/10/25 职场文书
大学生毕业自我评价范文分享
2013/11/11 职场文书
生产现场工艺工程师岗位职责
2013/11/28 职场文书
社区党员先进事迹
2014/01/22 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
小学教师师德反思
2014/02/03 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
运动会加油稿100字
2014/09/19 职场文书
党员个人党性分析材料
2014/12/18 职场文书
维稳工作承诺书
2015/01/20 职场文书
原料仓管员岗位职责
2015/04/01 职场文书