欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python如何巧妙實(shí)現(xiàn)數(shù)學(xué)階乘n!

 更新時(shí)間:2023年03月16日 09:41:14   作者:尤而小屋  
一個(gè)正整數(shù)的階乘(factorial)是所有小于及等于該數(shù)的正整數(shù)的積,并且0的階乘為1。自然數(shù)n的階乘寫作n!,本文就給大家介紹如何使用python和第三方庫(kù)來實(shí)現(xiàn)數(shù)學(xué)運(yùn)算中的階乘以及階乘累計(jì)求和

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)文章

最新評(píng)論