6.6.1 两个经典案例:阶乘和幂

本节探讨两个经典的递归函数。首先,假设你要计算数字n的阶乘。 n的阶乘为n × (n1) × (n 2) × … × 1,在数学领域的用途非常广泛。例如,计算将n个人排成一队有多少种方式。如何计算阶乘呢?可使用循环。

def factorial(n):

result = n

for i in range(1, n):

result *= i

return result

这种实现可行,而且直截了当。大致而言,它是这样做的:首先将result设置为n,再将其依次乘以1到n1的每个数字,最后返回result。但如果你愿意,可采取不同的做法。关键在于阶乘的数学定义,可表述如下。

 1的阶乘为1。

 对于大于1的数字n,其阶乘为n1的阶乘再乘以n。

如你所见,这个定义与本节开头的定义完全等价。

下面来考虑如何使用函数来实现这个定义。理解这个定义后,实现起来其实非常简单。

def factorial(n):

if n == 1:

return 1

else:

return n * factorial(n - 1)

这是前述定义的直接实现,只是别忘了函数调用factorial(n)和factorial(n – 1)是不同的实体。

再来看一个示例。假设你要计算幂,就像内置函数pow和运算符**所做的那样。要定义一个数字的整数次幂,有多种方式,但先来看一个简单的定义:power(x, n)(x的n次幂)是将数字x自乘n - 1次的结果,即将n个x相乘的结果。换而言之,power(2, 3)是2自乘两次的结果,即2 × 2 × 2 = 8。

这实现起来很容易。

def power(x, n):

result = 1

for i in range(n):

result *= x

return result

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

 对于任何数字x, power(x, 0)都为1。

 n>0时, power(x, n)为power(x, n-1)与x的乘积。

如你所见,这种定义提供的结果与更简单的迭代定义完全相同。理解定义是最难的,而实现起来很容易。

def power(x, n):

if n == 0:

return 1

else:

return x * power(x, n - 1)

我再次将定义从较为正规的文字描述转换成了编程语言(Python)。

提示 如果函数或算法复杂难懂,在实现前用自己的话进行明确的定义将大有裨益。以这种“准编程语言”编写的程序通常称为伪代码。

那么使用递归有何意义呢?难道不能转而使用循环吗?答案是肯定的,而且在大多数情况下,使用循环的效率可能更高。然而,在很多情况下,使用递归的可读性更高,且有时要高得多,在你理解了函数的递归式定义时尤其如此。另外,虽然你完全能够避免编写递归函数,但作为程

序员,你必须能够读懂其他人编写的递归算法和函数。

python基础案例教程_Python基础教程 两个经典案例:阶乘和幂相关推荐

  1. 视频教程-快速入门Python基础教程_Python基础知识大全-Python

    快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...

  2. 视频教程-快速入门Python基础教程_Python基础进阶视频-Python

    快速入门Python基础教程_Python基础进阶视频 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥199.00 立 ...

  3. [Python从零到壹] 六十一.图像识别及经典案例篇之基于纹理背景和聚类算法的图像分割

    祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...

  4. [Python从零到壹] 六十.图像识别及经典案例篇之基于阈值及边缘检测的图像分割

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. python代码入门教程_Python入门教程丨1300多行代码,让你轻松掌握基础知识点

    欢迎关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 前言 本文适合有经验的程序员尽快进入Python世界.特别地 ...

  6. python数值类型教程_Python 基础数据类型-数值类型

    Python 基础数据类型-数值类型 为什么会有数据类型?[了解] 更好分配管理内存 方便统一管理 更贴近人类分类管理习惯 数据类型种类 [熟悉] 数值类型:int.bool.float.comple ...

  7. python中factor函数_Python基础教程

    6.4.5 参数收集的逆过程 假设有如下函数: def add(x,y): return x+y 比如说有个包含由两个相加的数字组成的元组: params = (1,2) 使用*运算符对参数进行&qu ...

  8. python教程案例分析_Python实用教程(含典型案例视频分析)

    目 录 第一部分 基 础 篇 第1章 Python,掀起你的盖头来1 1.1 Python简介1 1.2 安装Python及其扩展库2 1.2.1 安装Python2 1.2.2 Python集成开发 ...

  9. python循环语句画图_Python基础之循环语句用法示例【for、while循环】

    本文实例讲述了Python基础之循环语句用法.分享给大家供大家参考,具体如下: while 循环 Python中while语句的一般形式: while 判断条件: statements 同样需要注意冒 ...

最新文章

  1. vim基础-一般模式
  2. 【科研经验】学霸为什么不喜欢给学渣解题?
  3. eclipse tomcat jsp乱码
  4. 网站大流量高并发访问的处理解决办法
  5. 如何赛筛选出多列内容相同的数据??
  6. js 深拷贝 和 浅拷贝
  7. 解决Vista文件操作缓慢问题:五大方案
  8. WebBrowser的Cookie操作
  9. 学习 服务器部署 hello world
  10. 详解 Array.prototype.slice.call(arguments)
  11. 今天实现了一个功能就是,树结点的拖动
  12. linux 装gcc组件,linux下安装redis组件报错-gcc报错
  13. TCP SYN-Cookie背后的人和事
  14. python实现四阶龙格库塔法
  15. 拼图复原_玩过上百款拼图后,我总结出这份超详细的拼图年龄对照表!(收藏贴)...
  16. java 最大整形_Java大整形BigInteger的用法
  17. 项目进度管理方法——里程碑式管理
  18. hadoop大数据平台搭建
  19. 互联网的前世今生:Web 1.0、2.0、3.0
  20. Layui开关添加弹出确认框及layer.confirm的回调

热门文章

  1. 吴恩达 深度学习 编程作业(2-1.1) Initialization
  2. c语言考试系统开发,基于WEB的(C语言)网络考试系统的开发与研究
  3. 搭建vue脚手架_webpack搭建vue脚手架
  4. php引擎,php基于什么引擎
  5. python return返回值_Python return语句 函数返回值
  6. mysql读写分离-借助中间键mycat
  7. mysql中的rman备份_oracle数据库 rman基本备份操作
  8. 内网和外网的区别_在家办公不再难,花生壳盒子助你内网穿透一臂之力
  9. 启动chrome_Chrome开启多线程下载的方法
  10. 多个ai文件合并成pdf_如何将多个文档合并成PDF?