Python练习题 021:递归方法求阶乘

时间:2024-03-26 17:03:50

【Python练习题 021】 利用递归方法求5!。

----------------------------------------------

首先得弄清楚:5! 指的是“5的阶乘”,即 5! = 1*2*3*4*5。

然后呢,据说,“递归”就是对自身进行调用的函数。听着挺奇怪,反正先依葫芦画瓢,写代码如下:

def f(x):
if x == 0:
return 0
elif x == 1:
return 1
else:
return (x * f(x-1))
print(f(5))

大概意思是说:如果 x=5,那么就返回 5*f(4) 的值。而想知道这个值,就得先算出 f(4) 等于多少。根据函数 f(x),f(4) = 4*f(3),所以 f(5) = 5*4*f(3)。以此类推,推到 f(5) = 5*4*3*2*f(1)。函数 f(x) 说了,当 x==1 时,返回值为 1。所以:f(5) = 5*4*3*2*1 = 120。所以,输出结果如下:

120

听起来好像很麻烦,感觉不好理解。如果不用递归函数呢?用最基本的代码,可以写成:

f = 1
for i in range(1,6):
f = f * i
print(f)

结果一样是120。

都说递归函数代码简洁、逻辑清晰。就这题而言……有吗?

【2016-10-18 更新】-----------------------------------------

在【Python练习题 021:累积累加】这一题中学到了 functools.reduce() 和 lambda,甚是好用,用来算阶乘更是得心应手。试解本题如下:

import functools
print(functools.reduce(lambda x,y:x*y, range(1,6)))

看,2行就搞定了,真爽!关于 functools.reduce() 和 lambda,请参见【Python练习题 021:累积累加】。

而感谢 codegay,我不但又学了一种新解法,还学到了 operator.mul(a, b) 新技能!先看代码:

import functools, operator
print(functools.reduce(operator.mul, range(1,6)))

这种解法其实与前例使用 lambda 的思路是一样的,只不过利用 operator.mul(用于计算 a*b) 代替 functools.reduce() 所需的函数部分,却也十分简洁明了,赞!

++++++++++++++++++++++++++++++++++++++

题目出处:编程语言入门经典100例【Python版】