对于求 n!,你可能会问,为何要用递归?有何优势?答案并不复杂,利用递归可以使算法的逻辑变得非常简单。因为递归过程的每一步用的都是同一个算法,计算机只需要自顶向下不断重复即可。

具体到阶乘的计算,无非就是某个数字 n 的阶乘,变成这个数乘以 n-1 的阶乘。因此,递归的法则就两条:一是自顶而下(从目标直接出发),二是不断重复。

递归的另一个特点在于,它只关心自己下一层的细节,而并不关心更下层的细节。你可以理解为,递归的简单源自它只关注“当下”,把握“小趋势”,虽然每一步都简单,但一直追寻下去,也能获得自己独特的精彩。

下面我们就以计算阶乘为例,分别使用递推和递归方式实现,见例 1,读者可体会二者的区别。

【例 1 】利用递推和递归方式分别计算 n!(iterative-recursive.py)。

#用正向递推的方式计算阶乘

def iterative_fact(n):

fact = 1

for i in range(1, n + 1):

fact *= i

return fact

#用逆向递归的方式计算阶乘

def recursive_fact(n):

if n <= 1 :

return n

return n * recursive_fact(n - 1)

#调用递推方法计算

num = 5

result = iterative_fact(num)

print("递推方法:{} != {}".format(num, result))

#调用递归方法计算

result = recursive_fact(num)

print ("递归方法:{} != {}".format(num,result))

程序执行结果为:

递推方法:5 != 120

递归方法:5 != 120

第 02~06 行定义了一个递推计算阶乘的函数 iterative_fact( ),函数内部采用 for 循环的方式来计算结果。在 for 循环控制过程中使用了 range( ) 函数,由于 range( ) 的取值区间是左闭右开的,最后一个值取不到,所以在第 04 行执行了 n+1 操作。

第 09~12 行定义一个递归函数 recursive_fact( ),采用递归的方式计算结果。

第 17 行和第 20 行用到了 Python 的格式化输出。在 Python 中,一切皆对象。用双引号引起来的字符串“递归方法:{}!= {}”,实际上是一个 str 对象。既然是对象,它就会有相应的方法成员,format( ) 就是用于格式化输出的方法,因此可以通过“对象.方法名”的格式来调用合适的方法。

字符串中的花括号{ }表示输出占位符,第 1 个占位符{ }用于输出 format( ) 函数中第 1 个变量,第 2 个占位符{ }用于输出 format( ) 函数中第 2 个变量,以此类推。

递归函数的优点在于,定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但正向递推(即循环)的逻辑不如逆向递归的逻辑清晰。

对于递推的实现,这里用到了前面章节中讲到的 for 循环语句,以 1 为基数不断循环相乘,最终得出阶乘的结果。而在递归实现的操作中,这里通过对方法本身压栈和弹栈的方式,将每一层的结果逐级返回,通过逐步累加求得结果。

recursive_fact(5)的计算过程如下。

===> recursive_fact(5)

===> 5 * recursive_fact(4)

===> 5 * (4 * recursive_fact(3))

===> 5 * (4 * (3 * recursive_fact(2))

===> 5 * (4 * (3 * (2 * recursive_fact(1))))

===> 5 * (4 * (3 * (2 * 1)))

===> 5 * (4 * (3*2))

===> 5 *(4*6)

===> 5 * 24

===> 120

需要注意的是,虽然递归有许多的优点,但缺点也很明显。那就是,使用递归方式需要函数做大量的压栈和弹栈操作,由于压栈和弹栈涉及函数执行上下文(context)的现场保存和现场恢复,所以程序的运行速度比不用递归实现要慢。

此外,大量的堆栈操作消耗的内存资源要比非递归调用多。而且,过深的递归调用还可能会导致堆栈溢出。如果操作不慎,还容易出现死循环。因此读者编写代码时需要多加注意,一定要设置递归操作的终止条件。

python使用函数的优点-Python递归函数的优缺点相关推荐

  1. python使用函数的优点-Python用了这么多年,总结出超实用的功能和特点

    在使用Python这么久,时不时就会发现了一些过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.本篇文章总结出你应该了解的Python功能特色,希望大家在学习过程中,少走弯路,善用技巧! ...

  2. python使用函数的优点-Python函数的特点

    函数对象 一.函数对象的四大工能 1.引用 def helllo(): x='helllo word' f=func print(f) 2.当作参数传给一个函数 def foo(m): m() foo ...

  3. python pos函数_使用python+sklearn实现特征提取

    sklearn.feature_extraction模块可用于以机器学习算法支持的格式从原始数据集(如文本和图像)中提取特征.**注意:**特征提取与特征选择有很大不同:前者是将任意数据(例如文本或图 ...

  4. python面向对象编程的优点-Python语言有哪些优点?

    2018年主流的十大编程语言中,Python排名第一,被广大使用者誉为"更美好"编程语言.Python语言自身的语言特点,使得他深受开发者的喜爱,那么Python语言到底有哪些优点 ...

  5. python的特点和优点-Python的优点和缺点有哪些?Python语言的特点

    任何一种编程语言,都有其优劣性,Python编程亦如此,以下是对Python优缺点的解析: 先看优点 Python的定位是"优雅"."明确"."简单& ...

  6. python画函数曲线-使用Python画数学函数曲线

    import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.figure(1) # 创建图表1 plt.fig ...

  7. python deepcopy函数_用Python解数独[6]:递归获得最终答案

    目录 用Python解数独[0] 用Python解数独[1]:求每个单元格的行值域 用Python解数独[2]:求列值域和九宫格值域 用Python解数独[3]:求总值域 用Python解数独[4]: ...

  8. python冒泡排序函数_python冒泡排序-Python,冒泡排序

    arr = [ 7 , 4 , 3 , 67 , 34 , 1 , 8 ] . def bubble_sort : 最近在学习Python,下面是我的一些笔记 冒泡排序 实现思路: 使用双重for循环 ...

  9. python isalnum函数_探究Python中isalnum()方法的使用

    探究Python中isalnum()方法的使用 isalnum()方法检查判断字符串是否包含字母数字字符. 语法 以下是isalnum()方法的语法: str.isa1num() 参数 NA 返回值 ...

最新文章

  1. 关于python中requests模块导入问题-Python中requests模块的核心使用(1)
  2. 人脸验证 DeepID 算法实践
  3. CSS3实例教程:border-image属性实例讲解
  4. Linear Regression总结2
  5. java多线程notifyall_Java多线程:线程状态以及wait(), notify(), notifyAll()
  6. 【软件测试】测试驱动开发
  7. 如何看CentOS系统是32位还是64位的?
  8. Faster RCNN 学习笔记
  9. VirtualBox – Error In supR3HardenedWinReSpawn 问题解决办法
  10. java millis_Java Duration.getMillis方法代码示例
  11. 微信小程序卡券java_微信小程序领取卡券(java)
  12. Cry with DX11
  13. lisp方格网法计算土方量_CAD计算土方方量插件
  14. UnityShader-平行光和点光源的基础介绍和使用
  15. 中国有哪些优秀的民谣音乐人?
  16. 状态方程的离散化仿真
  17. 实证论文复刻|stata安慰剂检验
  18. 【Vue3】搭建vue3项目以及环境
  19. linux下 cuda8,9,10 对应的cudnn 下载网盘链接分享
  20. RabbitMQ概念篇 vhost

热门文章

  1. Eclipse的Ctrl+鼠标左键的智能化链接配置
  2. ChartPart 图表显示
  3. MySQL高性能优化实战总结!
  4. 蓝牙4.0BLE抓包(一) - 搭建EN-Dongle工作环境 使用EN-Dongle抓包 nRF51822
  5. 如何获取启动页activity
  6. python学习笔记3-循环1
  7. Python中的字典排序
  8. JFreeChart入门
  9. 通过mongodb客户端samus代码研究解决问题
  10. 详解jQuery对象与DOM对象的相互转换