[英]How do I find the sum of series 1+ (1*2) + (1*2*3) … (1*2*3*…n) using recursion?
[英]How to find sum of recursion result
首先編寫一個名為rec_dig_sum
的 function ,它接收一個 integer 並返回該數字的遞歸數字總和。
遞歸數字和的示例:
101 => 1+0+1 = 2
191 => 1+9+1 = 11 => 1+1 = 2
5697 => 5+6+9+7 = 27 => 2+7 = 9
然后在另一個名為distr_of_rec_digit_sums
的 function 中使用 function ,它返回一個字典,其中鍵是遞歸數字和,值是出現在低位和高位(含)之間的那些數字和的計數。 假設 low 和 high 是正整數,其中 high 大於 low,並且 low 和 high 都不是負數。
我有這個作為第一部分:
def rec_dig_sum(n):
total = 0
for i in str(n):
total += int(i)
return total
令我困擾的是,OP 的遞歸解決方案以及此處介紹的其他解決方案中間有一個for
循環! 讓我們 go完全(雙重)遞歸解決這個問題! 既然這是一個數字問題,我們也拋開其他人都在使用的str()
function :
def rec_dig_sum(number):
if number < 10:
return number
quotient, remainder = divmod(number, 10)
return rec_dig_sum(rec_dig_sum(quotient) + remainder)
print(rec_dig_sum(101))
print(rec_dig_sum(191))
print(rec_dig_sum(5697))
OUTPUT
> python3 test.py
2
2
9
>
我的第二個 function 的示例解決方案是傳統的,但是我使用dict.fromkeys()
方法的少數機會之一:
def distr_of_rec_digit_sums(low=0, high=1500):
histogram = dict.fromkeys(range(10), 0)
for number in range(low, high + 1): # a low and high (inclusive) range
histogram[rec_dig_sum(number)] += 1
return histogram
print(distr_of_rec_digit_sums(0, 1500))
OUTPUT
> python3 test.py
{0: 1, 1: 167, 2: 167, 3: 167, 4: 167, 5: 167, 6: 167, 7: 166, 8: 166, 9: 166}
>
因此,對於您問題的兩個部分。
一、遞歸function:
def recursive_digits(n):
total = sum([int(i) for i in str(n)])
if total < 10:
return total
else:
return recursive_digits(total)
然后你在另一個function中使用它:
def distr_of_rec_digit_sums(low, high):
digits = {item : 0 for item in range(10)}
for i in range(low, high+1):
digits[recursive_digits(i)] += 1
return digits
而且由於 function 名稱以“distr”開頭,我猜有人對數字總和的分布感興趣。 它出人意料地(或不出所料地)統一。 這是針對您問題的范圍(0 - 1500)。
你快到了
def rec_dig_sum(n):
total = 0
for i in str(n):
total += int(i)
return str(total)
t = "5697"
while len(t) != 1:
t = rec_dig_sum(t)
print (t)
我們需要一個條件來中斷遞歸,對於這種情況,我們希望在位數為 1 時停止,即如果len(n) === 1
則我們將中斷。
如果不是,我們計算當前總和並重新開始。
def rec_dig_sum(n):
if len(n) == 1:
return int(n)
total = 0
for i in str(n):
total += int(i)
return rec_dig_sum(str(total))
rec_dig_sum(str(5697))
如果您正在學習遞歸並面臨困難,請首先使用循環(非遞歸)編寫相同的內容,然后嘗試通過刪除循環來使其遞歸。
看起來遞歸解決方案更適合,例如:
def rec_dig_sum(n):
if n < 0:
raise Exception('the arg must be positive')
# Stop condition: single number
if n < 10:
return n
else:
# Convert n into a str and each number back into int to be added
total = sum(map(int, str(n)))
return rec_dig_sum(total)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.