詳解Python如何巧妙實現(xiàn)數(shù)學階乘n!
python實現(xiàn)階乘-基礎版本
什么是階乘呢?
在數(shù)學運算中n!表示n的階乘,用數(shù)學公式表示為:
n!=1*2*3*....*(n-1)*n
下面提供了一個例子:比如5的階乘
#?正確的結果 1*2*3*4*5
正確結果為:120
小編給大家提供3種不同的方法來實現(xiàn)階乘運算:
- 基于for運算的累乘
- 基于遞歸函數(shù)實現(xiàn)
- 基于第三方庫functools的reduce函數(shù)實現(xiàn)
方式1-累乘
result?=?1??#?給定一個初始值
n?=?5
for?i?in?range(1,?n+1):
????print("累乘前result:?",?result)
????print("循環(huán)數(shù)i的值:?",?i)
????result?=?result?*?i??#?不斷地累成result
????print("累乘后result:?",?result)
????print("------------")
result
累乘前result: 1
循環(huán)數(shù)i的值: 1
累乘后result: 1
------------
累乘前result: 1
循環(huán)數(shù)i的值: 2
累乘后result: 2
------------
累乘前result: 2
循環(huán)數(shù)i的值: 3
累乘后result: 6
------------
累乘前result: 6
循環(huán)數(shù)i的值: 4
累乘后result: 24
------------
累乘前result: 24
循環(huán)數(shù)i的值: 5
累乘后result: 120
------------
結果是:120
方式2-使用遞歸函數(shù)
def?recursion(n): ????if?n?==?0?or?n?==?1:??#?特殊情況 ????????return?1 ????else: ????????return?n?*?recursion(n-1)??#?遞歸函數(shù)
recursion(5)
120
方式3-第三方庫functools的reduce函數(shù)
#?在python3中reduce函數(shù)被移入到functools中;不再是內(nèi)置函數(shù) from?functools?import?reduce? n?=?5 reduce(lambda?x,y:?x*y,?range(1,n+1))??
120
reduce函數(shù)的用法解釋:
reduce(function,?iterable[,?initializer])
- 需要給定一個待執(zhí)行的函數(shù)function(上面是匿名函數(shù);或者自定義函數(shù))
- 給定一個可迭代對象iterable
- 可選的初始值initializer
#?使用自定義函數(shù) from?functools?import?reduce? number?=?range(1,6) #?number?=?[1,2,3,4,5] def?add(x,y): ????return?x+y reduce(add,?number)??#?1+2+3+4+5
15
#?使用匿名函數(shù) from?functools?import?reduce? number?=?range(1,6) reduce(lambda?x,y:?x+y,?number)??#?1+2+3+4+5
15
python實現(xiàn)階乘累加求和-進階版
下面是一個進階的需求:如何實現(xiàn)階乘的累加求和?
#?求出下面的階乘的累加求和 1?+?1*2?+?1*2*3?+?1*2*3*4?+?1*2*3*4*5
正確結果是153
方式1-累乘+sum
#?定義累乘函數(shù) def?func(n): ????result?=?1 ???? ????for?i?in?range(1,?n+1): ????????result?=?result?*?i??#?不斷地累成re ?????????? ????return?result ???? func(5)??#?測試案例
120
上面是我們實現(xiàn)的單個數(shù)字的階乘,放入for循環(huán)即可求累計求和:
#?func(1)?+?func(2)?+?func(3)?+??func(4)?+?func(5) #?調(diào)用累乘函數(shù) sum(func(i)??for?i?in?range(1,6))
153
方式2-累乘+遞歸
在一個函數(shù)中同時使用累乘和遞歸函數(shù)
#?定義累乘函數(shù) def?func(n): ????result?=?1??#?定義初始值 ???? ????for?i?in?range(1,?n+1): ????????result?=?result?*?i??#?不斷地累成re ???? ????#?if?result?==?1?:??等價于下面的條件 ????if?n==0?or?n==1: ????????return?1 ????else: # 下面是關鍵代碼 ????????return?result?+?func(n-1)??#在這里實現(xiàn)遞歸?func(n-1) ???? func(5)??
153
方式3-遞歸+sum
def?recursion(n): ????""" ????之前定義的遞歸函數(shù) ????""" ????if?n?==?0?or?n?==?1: ????????return?1 ????else: ????????return?n?*?recursion(n-1)??
調(diào)用遞歸函數(shù)在基于for循環(huán)和sum求和
#?recursion(1)?+?recursion(2)?+?recursion(3)?+??recursion(4)?+?recursion(5) #?調(diào)用定義的遞歸函數(shù) sum(recursion(i)??for?i?in?range(1,6))
153
方式4-reduce 結合 sum
from?functools?import?reduce? n?=?5 reduce(lambda?x,y:?x*y,?range(1,n+1))??
120
單次調(diào)用reduce函數(shù),結合for循環(huán)和sum求和
sum(reduce(lambda?x,y:?x*y,?range(1,n+1))?for?n?in?range(1,6))
153
方式5-兩次reduce函數(shù)
[reduce(lambda?x,y:?x*y,?range(1,n+1))?for?n?in?range(1,6)]
[1, 2, 6, 24, 120]
將上面的結果作為可迭代的列表再次傳入reduce函數(shù),此時的執(zhí)行函數(shù)是兩個元素的求和(x+y):
reduce(lambda?x,y:x+y,?[reduce(lambda?x,y:?x*y,?range(1,n+1))?for?n?in?range(1,6)]?)
153

以上就是詳解Python如何巧妙實現(xiàn)數(shù)學階乘n!的詳細內(nèi)容,更多關于Python數(shù)學階乘n!的資料請關注腳本之家其它相關文章!
相關文章
Python列表數(shù)據(jù)如何按區(qū)間分組統(tǒng)計各組個數(shù)
這篇文章主要介紹了Python列表數(shù)據(jù)如何按區(qū)間分組統(tǒng)計各組個數(shù),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
PyCharm+Pipenv虛擬環(huán)境開發(fā)和依賴管理的教程詳解
這篇文章主要介紹了PyCharm+Pipenv虛擬環(huán)境作開發(fā)和依賴管理的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Pyqt5?Designer構建桌面應用設計及實現(xiàn)代碼
這篇文章主要為大家介紹了Pyqt5?Designer構建桌面應用設計及實現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
在?Python?中創(chuàng)建DataFrame的方法
這篇文章主要介紹了教你如何在?Python?中創(chuàng)建DataFrame,我們將學習以多種方式創(chuàng)建DataFrame,DataFrame是數(shù)據(jù)的二維集合,是一種數(shù)據(jù)結構,其中數(shù)據(jù)以表格形式存儲,更多相關資料需要的小伙伴可以參考一下2022-03-03
使用Python實現(xiàn)嵌套繪圖并為條形圖添加自定義標注
論文繪圖時經(jīng)常需要多圖嵌套,正好最近繪圖用到了,所以這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)嵌套繪圖并為條形圖添加自定義標注,感興趣的可以了解下2024-02-02

