首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求递归结果的和

如何求递归结果的和
EN

Stack Overflow用户
提问于 2020-07-16 22:09:17
回答 4查看 797关注 0票数 0

首先编写一个名为rec_dig_sum的函数,它接受一个整数并返回该数字的递归数字和。

递归数字和的例子:

代码语言:javascript
复制
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的函数中使用该函数,该函数返回一个字典,其中键是递归数字和,值是在输入数字的低(包括)范围内发生的那些数字和的计数。假设低整数和高整数是正整数,高整数大于低整数,低整数和高整数都不是负整数。

我的第一部分是:

代码语言:javascript
复制
def rec_dig_sum(n):
    total = 0
    for i in str(n):
      total += int(i)
    return total
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-07-17 04:54:45

令我烦恼的是,OP的递归解决方案和这里提出的其他解决方案中间都有一个for循环!让我们在这个问题上完全(加倍)递归!由于这是一个数字问题,让我们也抛出其他人都在使用的str()函数:

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
> python3 test.py
2
2
9
>

第二个函数的示例解决方案是传统的,但我使用dict.fromkeys()方法的机会之一是:

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
> python3 test.py
{0: 1, 1: 167, 2: 167, 3: 167, 4: 167, 5: 167, 6: 167, 7: 166, 8: 166, 9: 166}
> 
票数 3
EN

Stack Overflow用户

发布于 2020-07-16 22:39:41

所以你的问题的两个部分。

首先,递归函数:

代码语言:javascript
复制
def recursive_digits(n):
    total = sum([int(i) for i in str(n)])
    if total < 10:
        return total
    else:
        return recursive_digits(total)

然后在另一个函数中使用它:

代码语言:javascript
复制
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

因为函数名以'distr‘开头,我想,有人对以数字和表示的分布感兴趣。这是令人惊讶的(或不出所料)的制服。这是你问题的范围(0-1500)。

票数 1
EN

Stack Overflow用户

发布于 2020-07-16 22:16:46

你就快到了

如果没有递归,它将是:

代码语言:javascript
复制
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,我们就会中断。

如果没有,我们计算当前和,然后再开始。

代码语言:javascript
复制
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))

如果您正在学习递归并面临困难,请从编写相同的使用循环(非递归)开始,然后通过指定目标来删除循环来使其成为递归的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62944232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档