Python 用六種方法實現 n 的階乘

2021-09-17 21:20:52 字數 2180 閱讀 1379

首先從數學的定義原理上分析,n!的數學定義有兩種:

階乘是基斯頓·卡曼(christian kramp,1760~1826)於2023年發明的運算符號,是數學術語。乙個正整數的階乘(factorial)是所有小於及等於該數的正整數的積,並且0的階乘為1。自然數n的階乘寫作n!。2023年,基斯頓·卡曼引進這個表示法。

亦即n!=1×2×3×...×n。階乘亦可以遞迴方式定義:0!=1,n!=(n-1)!×n。

--> 這裡就有了兩種解法:1、是從 1 一直乘到 n ;2、0!=1,n!=(n-1)!×n 這是一種遞迴的定義,亦可以用遞迴函式來實現。

最簡單的實現方法,即使用python自帶的math模組裡的factorial方法:

def func3(n):

from math import factorial

if n >= 0: return factorial(n)

else: print('出錯')

# 整數的階乘(英語:factorial)是所有小於及等於該數的正整數的積,0的階乘為1。即:n!=1×2×3×...×n。所以這裡可以直接使用factorial方法算出n 的階乘。

使用定義0!= 1;n!= (n - 1)!* n來計算,這裡很容易想到遞迴函式:

def func0(n):

if n == 0: return 1

elif n >= 1: return n * func0(n - 1)

else: print('出錯')

def func1(n):

_list =

while true:

if n > 0:

n -= 1

elif n == 0:

while len(_list) > 1:

x_nub = _list[-1] * _list[-2]

del _list[-1]

del _list[-1]

return _list[0]

else: print('出錯'); break

# func0函式用了遞迴函式,func1函式則解釋了遞迴函式內部方法,詳細見& 

然後使用定義n!= 1*2*3*……*n,來計算:

def func2(n):

mul = lambda a, b: a * b

from functools import reduce

if n > 1: return reduce(mul, range(1, n + 1))

if n == 1 or n == 0: return 1

else: print('出錯')

def func4(n):

if n >= 1: return eval("*".join([str(i) for i in range(1, n + 1)]))

elif n == 0: return 1

else: print('出錯')

def func5(n):

if n in (0,1): return 1

elif n > 1:

in_num = n

while n > 1:

n -= 1

in_num *= n

return in_num

else: print('出錯')

# func2函式比較好理解,實現原理就是計算1*2*3*……*n,先計算1*2得到2,再用前面的得數乘後的 3 得到新的得數,反覆到 n。這裡的reduce函式就是實現這個操作的高階函式。匿名函式 mul 實現兩個數相乘,返回值作為結果。

# func4函式,其思路是 n!相當於 1*2*3*……*n 這個式子,把它先完整的寫下來,再交給python處理這個式子,eval函式裡面的表示式就是用來輸出1*2*3*……*n這樣乙個字串的,eval函式則用來執行字串裡面的內容。

@ 它們倆的區別就在於fac2是把多個項相乘變成了兩個兩個相乘,其中的reduce函式就有一種遞迴的思想;fac4則是把多個項組成的式子全寫了出來,然後一起交給程式做乘法。

# func5是用while來求解的

當然 python 計算 n!的方法遠遠不止這麼幾種,這裡主要提供乙個思考方向供讀者參考。

居中的六種方法

居中效果在css中很是普通的效果,平時大家所看到的居中效果主要分為三大類 水平居中 垂直居中和水平垂直居中。而其中水平居中相對於後兩者來說要簡單得多。早期總結了一下網際網路上有關於水平垂直居中的幾種實現方案,比如說 css製作水平垂直居中對齊 中介紹了八中實現水平垂直的方案,而在 css製作水平垂直...

陣列遍歷六種方法

foreach some every map filter reducer var arr 1,2,3,4 arr.foreach item,index,arr foreach遍歷陣列,無返回值,不改變原陣列,僅僅只是遍歷 常用於註冊元件 指令等等。var arr 1,2,3,4 arr.some ...

去水印六種方法

1 使用仿製圖章工具去除 使用仿製圖章工具去除文字這是比較常用的方法,具體的操作是,選取仿製圖章工具,按住alt鍵,在無文字區域點選相似的色彩名圖案取樣,然後在文字區域拖動滑鼠複製以覆蓋文字。要注意的是,取樣點即為複製的起始點。選擇不同的筆刷直徑會影響繪製的範圍,而不同的筆刷硬度會影響繪製區域的邊緣...