Python練習題 021 遞迴方法求階乘

2022-03-26 15:33:11 字數 1353 閱讀 9579

【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 = 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版】

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...