詳解Python如何巧妙實(shí)現(xiàn)數(shù)學(xué)階乘n!
python實(shí)現(xiàn)階乘-基礎(chǔ)版本
什么是階乘呢?
在數(shù)學(xué)運(yùn)算中n!表示n的階乘,用數(shù)學(xué)公式表示為:
n!=1*2*3*....*(n-1)*n
下面提供了一個(gè)例子:比如5的階乘
#?正確的結(jié)果 1*2*3*4*5
正確結(jié)果為:120
小編給大家提供3種不同的方法來實(shí)現(xiàn)階乘運(yùn)算:
- 基于for運(yùn)算的累乘
- 基于遞歸函數(shù)實(shí)現(xiàn)
- 基于第三方庫functools的reduce函數(shù)實(shí)現(xiàn)
方式1-累乘
result?=?1??#?給定一個(gè)初始值
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
------------
結(jié)果是: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])
- 需要給定一個(gè)待執(zhí)行的函數(shù)function(上面是匿名函數(shù);或者自定義函數(shù))
- 給定一個(gè)可迭代對(duì)象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實(shí)現(xiàn)階乘累加求和-進(jìn)階版
下面是一個(gè)進(jìn)階的需求:如何實(shí)現(xiàn)階乘的累加求和?
#?求出下面的階乘的累加求和 1?+?1*2?+?1*2*3?+?1*2*3*4?+?1*2*3*4*5
正確結(jié)果是153
方式1-累乘+sum
#?定義累乘函數(shù) def?func(n): ????result?=?1 ???? ????for?i?in?range(1,?n+1): ????????result?=?result?*?i??#?不斷地累成re ?????????? ????return?result ???? func(5)??#?測(cè)試案例
120
上面是我們實(shí)現(xiàn)的單個(gè)數(shù)字的階乘,放入for循環(huán)即可求累計(jì)求和:
#?func(1)?+?func(2)?+?func(3)?+??func(4)?+?func(5) #?調(diào)用累乘函數(shù) sum(func(i)??for?i?in?range(1,6))
153
方式2-累乘+遞歸
在一個(gè)函數(shù)中同時(shí)使用累乘和遞歸函數(shù)
#?定義累乘函數(shù) def?func(n): ????result?=?1??#?定義初始值 ???? ????for?i?in?range(1,?n+1): ????????result?=?result?*?i??#?不斷地累成re ???? ????#?if?result?==?1?:??等價(jià)于下面的條件 ????if?n==0?or?n==1: ????????return?1 ????else: # 下面是關(guān)鍵代碼 ????????return?result?+?func(n-1)??#在這里實(shí)現(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 結(jié)合 sum
from?functools?import?reduce? n?=?5 reduce(lambda?x,y:?x*y,?range(1,n+1))??
120
單次調(diào)用reduce函數(shù),結(jié)合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]
將上面的結(jié)果作為可迭代的列表再次傳入reduce函數(shù),此時(shí)的執(zhí)行函數(shù)是兩個(gè)元素的求和(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如何巧妙實(shí)現(xiàn)數(shù)學(xué)階乘n!的詳細(xì)內(nèi)容,更多關(guān)于Python數(shù)學(xué)階乘n!的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python列表數(shù)據(jù)如何按區(qū)間分組統(tǒng)計(jì)各組個(gè)數(shù)
這篇文章主要介紹了Python列表數(shù)據(jù)如何按區(qū)間分組統(tǒng)計(jì)各組個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
PyCharm+Pipenv虛擬環(huán)境開發(fā)和依賴管理的教程詳解
這篇文章主要介紹了PyCharm+Pipenv虛擬環(huán)境作開發(fā)和依賴管理的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Pyqt5?Designer構(gòu)建桌面應(yīng)用設(shè)計(jì)及實(shí)現(xiàn)代碼
這篇文章主要為大家介紹了Pyqt5?Designer構(gòu)建桌面應(yīng)用設(shè)計(jì)及實(shí)現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Python?Socket實(shí)現(xiàn)遠(yuǎn)程木馬彈窗詳解
這篇文章主要介紹了Python?Socket實(shí)現(xiàn)遠(yuǎn)程木馬彈窗詳解,Socket用來描述IP地址和端口,是通信鏈的句柄,應(yīng)用程序可以通過Socket向網(wǎng)絡(luò)發(fā)送請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求2022-07-07
在?Python?中創(chuàng)建DataFrame的方法
這篇文章主要介紹了教你如何在?Python?中創(chuàng)建DataFrame,我們將學(xué)習(xí)以多種方式創(chuàng)建DataFrame,DataFrame是數(shù)據(jù)的二維集合,是一種數(shù)據(jù)結(jié)構(gòu),其中數(shù)據(jù)以表格形式存儲(chǔ),更多相關(guān)資料需要的小伙伴可以參考一下2022-03-03
PyQt5+QtChart實(shí)現(xiàn)繪制極坐標(biāo)圖
QChart是一個(gè)QGraphicScene中可以顯示的QGraphicsWidget。本文將利用QtChart實(shí)現(xiàn)極坐標(biāo)圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
使用Python實(shí)現(xiàn)嵌套繪圖并為條形圖添加自定義標(biāo)注
論文繪圖時(shí)經(jīng)常需要多圖嵌套,正好最近繪圖用到了,所以這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)嵌套繪圖并為條形圖添加自定義標(biāo)注,感興趣的可以了解下2024-02-02
上手簡(jiǎn)單,功能強(qiáng)大的Python爬蟲框架——feapder
這篇文章主要介紹了上手簡(jiǎn)單,功能強(qiáng)大的Python爬蟲框架——feapder的使用教程,幫助大家更好的利用python進(jìn)行爬蟲,感興趣的朋友可以了解下2021-04-04

