【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() 所需的函數部分,卻也十分簡潔明了,贊!
++++++++++++++++++++++++++++++++++++++