【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。所以,輸出結果如下:
聽起來好像很麻煩,感覺不好理解。如果不用遞迴函式呢?用最基本的**,可以寫成:f = 1for i in range(1,6):
f = f * i
print(f)
結果一樣是120。
都說遞迴函式**簡潔、邏輯清晰。就這題而言……有嗎?
【2016-10-18 更新】-----------------------------------------
在【python練習題 021:累積累加】這一題中學到了 functools.reduce() 和 lambda,甚是好用,用來算階乘更是得心應手。試解本題如下:
import functoolsprint(functools.reduce(lambda x,y:x*y, range(1,6)))
看,2行就搞定了,真爽!關於 functools.reduce() 和 lambda,請參見【python練習題 021:累積累加】。
而感謝 codegay,我不但又學了一種新解法,還學到了 operator.mul(a, b) 新技能!先看**:
import functools, operatorprint(functools.reduce(operator.mul, range(1,6)))
這種解法其實與前例使用 lambda 的思路是一樣的,只不過利用 operator.mul(用於計算 a*b) 代替 functools.reduce() 所需的函式部分,卻也十分簡潔明瞭,贊!
題目出處:程式語言入門經典100例【python版】
python書中練習題 python練習題
1 定義乙個空列表,接收從鍵盤輸入的整數,把列表傳給乙個從大到小排序的函式,再輸出排序後的列表的值 listex b 0 a int input 請輸入列表長度 while b a num int input 請輸入字元 b 1 print listex sum 0 for i in range 0...
python的練習題 Python練習題
1 使用while迴圈輸入1 2 3 4 5 6 8 9 10 i 0while i 10 i i 1 if i 7 continue print i 結果 e python python python test.py1 2 求1 100的所有數的和 i 0sum 0 while i 100 i 1...
遞迴函式練習題
1 寫乙個函式,接收乙個引數,用來返回這個函式的階乘並輸出 12345 def func num if num 1 return 1 ret func num 1 return num ret print func 5 2 寫乙個函式實現斐波那契數列 1,2,3,5,8,13,21,34,55,89...