Python練習題 021:遞歸方法求階乘


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM