詳解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)
- 基于第三方庫(kù)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-第三方庫(kù)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)文章
Python3之字節(jié)串bytes與字節(jié)數(shù)組bytearray的使用詳解
今天小編就為大家分享一篇Python3之字節(jié)串bytes與字節(jié)數(shù)組bytearray的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python中的類的定義和對(duì)象的創(chuàng)建方法
object?是?Python?為所有對(duì)象提供的?基類,提供有一些內(nèi)置的屬性和方法,可以使用?dir?函數(shù)查看,這篇文章主要介紹了Python中的類的定義和對(duì)象的創(chuàng)建,需要的朋友可以參考下2022-11-11Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實(shí)例
這篇文章主要為大家介紹了Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08pandas中apply和transform方法的性能比較及區(qū)別介紹
這篇文章主要介紹了pandas中apply和transform方法的性能比較,在文中給大家講解了apply() 與transform()的相同點(diǎn)與不同點(diǎn),需要的朋友可以參考下2018-10-10python判斷端口是否打開的實(shí)現(xiàn)代碼
python判斷端口是否打開的代碼,有需要的朋友可以參考下2013-02-02python實(shí)現(xiàn)用類讀取文件數(shù)據(jù)并計(jì)算矩形面積
今天小編就為大家分享一篇python實(shí)現(xiàn)用類讀取文件數(shù)據(jù)并計(jì)算矩形面積,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01pytorch: Parameter 的數(shù)據(jù)結(jié)構(gòu)實(shí)例
今天小編就為大家分享一篇pytorch: Parameter 的數(shù)據(jù)結(jié)構(gòu)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python腳本Selenium及頁(yè)面Web元素定位詳解
這篇文章主要為大家介紹了Python腳本中如何使用Selenium定位頁(yè)面Web元素的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10