from?__future__?import?division
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設計制作、成都做網(wǎng)站與策劃設計,納雍網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:納雍等地區(qū)。納雍做網(wǎng)站價格咨詢:18982081108
def?FuncSum(n):
s=1;f=1
for?i?in?range(1,n+1):
f*=i
s+=1/f;
return?s
if?__name__=="__main__":
n=int(input("please?input?number?n:"))
if?1n=20:
print("s=%f"%FuncSum(n))
else:
raise?ValueError("n?must?big?than?1?and?less?or?equal?20")
def sum_factorial(start, stop):
# 遞歸求階乘
def factorial(n):
if n == 0: return 1
return n * factorial(n-1)
# 生成器解析式生成各個數(shù)的階乘,然后再求和
return sum(factorial(i) for i in range(start, stop+1))
# 調(diào)用函數(shù),測試代碼
print(sum_factorial(1, 20))
注意:
在不調(diào)用庫的情況下,最容易想到的就是循環(huán)里面套循環(huán),不過這樣子占用時間為O(n^2)。當然你這里也就n=20,兩層循環(huán)沒啥問題,不過當n足夠大時,可以考慮用算法。
遞歸算法占用時間為O(n),一個for循環(huán)為O(stop+1-start),兩者相加,比兩層循環(huán)效率高,當然這也是在n足夠大的時候,才談效率。
python不鼓勵遞歸,請看這個函數(shù)的遞歸版(def sn_recursion)和非遞歸版(def sn)的代碼對比:
#python 3.6.4
sum = 0
temp=1
shu = int(input("請輸入所求的一個數(shù)階乘倒數(shù)的累加和: "))
for i in range(1, shu+1):
temp=temp*i
sum=sum+1.0/temp?
print("1!+2!+.....+{0}={1}".format(shu,sum))
測試:
請輸入所求的一個數(shù)階乘倒數(shù)的累加和: 1
1!+2!+.....+1=1.0
請輸入所求的一個數(shù)階乘倒數(shù)的累加和: 2
1!+2!+.....+2=1.5
請輸入所求的一個數(shù)階乘倒數(shù)的累加和: 3
1!+2!+.....+3=1.6666666666666667
請輸入所求的一個數(shù)階乘倒數(shù)的累加和: 10
1!+2!+.....+10=1.7182818011463847
請輸入所求的一個數(shù)階乘倒數(shù)的累加和: 100
1!+2!+.....+100!=1.7182818284590455
#n充分大,結果就是e-1(e=2.718281828...)
def recursion(n):
if n==1:
return 1
else:
return n*recursion(n-1)
list=[]
#定義一個空的列表,將調(diào)用遞歸函數(shù)生成的階乘值追加到列表
print("將1-10的階乘寫入列表,使用sum函數(shù)求和") #顯示效果明顯
for i in range(1,11):
list.append(recursion(i))# 將調(diào)用遞歸函數(shù)生成的階乘值追加到列表
print(sum(list)) #列表求和
sum_0=0
#顯示效果明顯,center(80,"*")標題放置位置
print("for循環(huán)直接調(diào)用遞歸函數(shù)求和".center(80,"*"))
for i in range(1,11):
sum_0 +=recursion(i)
print(sum_0)
這是1-10的階乘求和,你可以參考下!
輸出的結果
res = 1
for i in range(1, 11): #1~10的階乘
ress *= i
print(res)