【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() 所需的函数部分,却也十分简洁明了,赞!
++++++++++++++++++++++++++++++++++++++