簡體   English   中英

如何找到遞歸結果的總和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM