前言

说到递归,如果是从其他编程语言转到 Python 的童鞋对这个词一定不会陌生,在很多情况下,使用递归可以提高程序的可读性,虽然可以完全避免编写递归函数,转而使用循环来代替,但是作为程序猿,至少必须要能够读懂其他人编写的递归算法和函数吧。OK,废话不多说,来看一下 Python 中递归函数的写法。

定义

所谓递归,就是调用函数自身。
简单的说就是函数自己调用自己。递归可能难以理解,也可能非常简单,这取决于对它的熟悉程度。
下面是一个递归函数的定义:

>>> def recursion():
...     return recursion()

这个递归定义显然什么都没有做,如果运行该函数的结果就是一段时间后程序就崩掉了。因为每次调用函数都将会消耗一些内存,当内存爆满就自然就挂了。
这个函数中的递归成为无穷递归,就好比一个 while 死循环,从理论上说它将永远不会结束,这显然不是我们想要的结果。

所以正常的递归函数通常包含以下两个部分;

1.基线条件(针对最小的问题):满足这种条件时函数将直接返回一个值。
2.递归条件:包含一个或多个调用,这些调用旨在解决问题的一部分。

这里的关键是,通过将问题分解为较小的部分,可避免递归没完没了,因为问题终将被分解成基线条件可以解决的最小问题。

OK,以上的定义和描述可能对于一个刚接触递归的人来说有些难以理解,接下来通过几个示例来看看递归的用法。

递归经典案例

计算阶乘

阶乘定义:n 的阶乘为 n*(n-1)*(n-2)*…*1
那么要计算阶乘,用传统的循环方式写法如下:

def factorial(n):result = nfor i in range(1,n):result *= ireturn result

上述循环的思路大概是:首先将 result 设置成 n,然后通过循环,将 result 依次乘以1~(n-1)的每个数字,最后返回结果。

而通过递归的方式如何实现呢,再看阶乘的算法,n 的阶乘其实相当于 n 乘以(n-1)的阶乘,而1的阶乘为1。
通过以上分析,来看看通过递归来实现阶乘的写法:

def factorial(n):if n == 1:return 1else:return n*factorial(n-1)

很明显,通过递归来实现同样算法,代码非常简单,并且可读性也很好。这是前述定义的直接实现,只是别忘了函数调用factorial(n)和factorial(n-1) 是不同的实体。

计算幂

定义一个数字的整数次幂,有多种方式,先来看个简单的定义:power(x,n)(x 的 n 次幂)是将数字 x 自乘以 n-1次的结果,即将 n 个 x 相乘。
传统的写法,通过循环来实现:

def power(x,n):result = 1for i in range(n):result *= xreturn result

这是一个非常简单的小型函数,可将定义修改成递归的形式:

对于任何数字的0次幂都是1
当 n 大于0时,power(x,n)为 x和 power(x,n-1)的乘积。

那么来看看递归的写法:

def power(x,n):if n == 0:return 1else:return x*power(x,n-1)

二分法查找

二分法查找,这是一个非常经典的查找算法,所谓的二分法,就是让每次查找的范围减半,这样查找效率非常的高,比如说一个猜数游戏,从1~100数字中猜出对方想好的一个数字,如果从1到100一个个的猜,肯定能猜对,最多会猜100次,那么最少需要猜多少次呢,通过二分法实际上只需要7次就能猜出正确答案。
结合二分法的定义引出递归的定义和实现。

1.如果上限和下限相同,就说明它们都指向数字所在的位置,因此将该数字返回。
2.否则,找出区间的中间位置(上限和下限的平均值),再将数字确定是在左半部分还是有半部分,然后继续在数字所在的那部分中查找。

OK,接下来看看递归实现二分法算法:

def search(seq,number,lower = 0,upper = None):if upper is None:upper = len(seq) - 1if lower == upper:assert number == seq[upper]return upperelse:middle = (lower + upper) // 2if number > seq[middle]:return search(seq,number,middle + 1,upper)else:return search(seq,number,lower,middle)

这里将上限和下限值定义成可选,如果不指定上下限值,那么默认为序列的开头和结尾位置。该递归的实现完全由上面的定义一致。
来看看效果:

seq = [23,1,35,38,89,24,32,76]
seq.sort()
print(seq)
print(search(seq,32))
print(search(seq,89))

返回结果:

[1, 23, 24, 32, 35, 38, 76, 89]
3
7

二分法在对于一个非常大的序列中使用效率非常高,如果使用循环的方式一个个的去找,对于序列中元素较少的情况下还好,如果数据量非常大,查询效率就很低了。

由此可见,递归的写法非常简洁,合理使用递归程序的可读性将会大大的提高。

Python之递归函数相关推荐

  1. python利用递归函数实现斐波那契数列_Python递归及斐波那契数列

    原博文 2016-07-01 23:30 − 递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ...

  2. python基础——递归函数

    python基础--递归函数 递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用 ...

  3. python中递归函数写法_python中递归函数如何创建

    递归函数是编程技术之一,这意味着你的程序包含你自己调用的函数.与迭代函数一样,在多次执行类似处理时可以使用递归函数,但递归函数可以通过用简单的代码替换它们来处理更复杂的问题.本篇文章我们就来看看pyt ...

  4. python的递归函数

    递归函数简单的定义:1.函数调用自身函数的行为.2.有一个正确的返回条件 python的递归函数有默认递归深度且可以设置 以下几个算法实例可以更好的理解递归函数的定义和使用场景 例1,一个求阶乘的函数 ...

  5. python中递归函数的实例_Python 递归函数详解及实例

    Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是 ...

  6. 汉诺塔游戏的python实现——递归函数

    汉诺塔游戏python实现 def move(n, a, b, c): if n == 1: print('move', a, '-->', c) else: move(n-1, a, c, b ...

  7. python中递归函数写法_python递归函数用法详解

    上期我们介绍了函数式编程,这期内容就是关于递归的函数内容,本期还是按照老规矩,给大家进行核心整理,内容通俗易懂,搭配实际应用,以供大家理解. 关于递归: 百度解释:是指函数/过程/子程序在运行过程序中 ...

  8. python中递归函数基例_智慧树python答案

    智慧树python答案 s = "abcd1234",find()函数可以在字符串中搜索子串,s.find("cd")返回的结果是__________. 单tr ...

  9. python静态递归函数_Python递归函数相关

    函数中调用其他函数是解决实际问题中常用方法,递归函数便是函数在运行过程中调用自身的函数.它像是循环的另一种表达方式,不过相较于写循环,递归函数封装性较好.可读性较强.在解决一些循环问题时,使用递归函数 ...

最新文章

  1. mysql数据库建仓范式_存mysql个数
  2. 【matlab】第三章数组和数组的运算
  3. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)
  4. mysql不复制数据_复制/复制数据库而不使用mysqldump
  5. javaweb网关_Java网关服务-AIO(三)
  6. 使用深度学习框架 Tensorflow 实现线性回归 (Linear Model)
  7. 最全面超大规模数据集下载链接汇总(转)
  8. 网页打开Android APP
  9. 恐怖!Spring Boot “内存泄漏”,排查竟这么难!
  10. 最新2020版IDEA下载安装教程
  11. SpringMvc中的@RequestMapping value 6个基本用法
  12. 量化经济学:手把手教你如何使用EXCEL分析股票历史数据
  13. android+怎么分享图片大小,Android微信分享图片大于32k进行压缩
  14. 安装darknet报libQt5Core.so.5: undefined reference
  15. 不要去打扰别人的幸福
  16. 蚁狮优化算法( Ant Lion Optimizer,ALO)-Matlab源码
  17. 阿里内部的那个牛逼带闪电的Java诊断工具arthas终于开源了
  18. zz国外接活网站Elance, Freelancer和ScriptLance的介绍和对比
  19. python keyboard backspace_selenium键盘按键Keys类及键盘码详解
  20. 备份还原数据数据库(固定IP版)

热门文章

  1. 8问8答,一篇文章读懂空间音效
  2. 互联网1分钟 |1130
  3. 关于vue-cli创建项目(小白)(2)mock数据
  4. 简事二三 之 http缓存机制
  5. python基础===使用switch方法,减少使用if语句
  6. 大数据促健康产业高增长
  7. python批量导入MongoDB数据库
  8. 推荐一个SAM文件中flag含义解释工具--转载
  9. 【Python】PAT-1007-素数对猜想
  10. win11 WSL centos7安装docker命令整理