4

我需要编写一个代码来计算一个数字的数字之和,这些是问题的确切文本:数字 n 的数字和是它的数字之和。编写一个递归函数 digitalSum(n),它接受一个正整数 n 并返回其数字和。例如,digitalSum(2019) 应该返回 12,因为 2+0+1+9=12。这是我写的代码:

def digitalSum(n):
   L=[] 
   if n < 10:
      return n
   else:
      S=str(n)
      for i in S:
         L.append(int(i))
      return sum(L)

这些代码工作正常,但它不是递归函数,我不允许将任何 int 更改为 str。你能帮帮我吗?

4

10 回答 10

10

试试这个:

def digitalSum(n):
    if n < 10 :
        return n
    return n % 10 + digitalSum( n // 10 )

编辑:该算法背后的逻辑是,对于递归函数的每次调用,我们都会去掉数字的最后一位并将其添加到总和中。首先我们获得最后一位数字,n % 10然后我们再次调用该函数,传递最后一位数字被截断的数字:n // 10。我们只有在达到一位数时才会停下来。在我们停止之后,当递归调用返回时,以相反的顺序计算数字的总和。

数字 12345 的示例:

5 + digitalSum( 1234 )
5 + 4 + digitalSum( 123 )
5 + 4 + 3 + digitalSum( 12 )
5 + 4 + 3 + 2 + 1 <- done recursing
5 + 4 + 3 + 3
5 + 4 + 6
5 + 10
15
于 2012-08-24T09:54:15.797 回答
3

这是家庭作业,所以我没有写太多代码。递归可以通过以下方式使用:

  • 获取第一个(或最后一个)数字
  • 将其余部分格式化为较短的数字
  • 将数字和较短数字的数字和相加(递归!)
于 2012-08-24T09:53:56.633 回答
3

这更多是与算法有关的问题。

这是你的答案:

def digit_sum(a):
    if a == 0:
        return 0
    return a % 10 + digit_sum(a/10)

如果您不明白它为什么起作用,请告诉我,我会提供解释。

于 2012-08-24T09:56:55.500 回答
1

一些提示:

  1. 您可以在 Python 中定义内部函数
  2. 您可以使用模数运算符(查找其语法和用法)以获得良好的效果,here
  3. 无需使用适当的递归解决方案构建显式列表表示

编辑以上作为一般答案有点“糟糕”,如果其他人在非家庭作业环境中遇到这个问题怎么办?然后堆栈溢出失败......

所以,这就是我将如何实现它,需要决定是否应该继续阅读。:)

def digitalSum(n):
  def process(n, sum):
    if n < 10:
      return sum + n
    return process(n / 10, sum + n % 10)
  return process(n, 0)

这可能有点太多了,但即使在学习情况下,获得一个答案也是有启发性的。

我的解决方案比某些解决方案更冗长,但它对尾调用优化编译器也更友好,我认为这是一个特性。

于 2012-08-24T09:51:07.100 回答
0
def digital_sum(number):
    if number < 10: 
        return number
    else:
        return number % 10 + digital_sum(number / 10) 
于 2012-08-24T09:57:37.180 回答
0
def sumofdigits(a):
    a = str(a)
    a = list(a)
    b = []
    for i in a:
        b.append(int(i))
        b = sum(b)
    if b > 9:
        return  sumofdigits(b)
    else:
        return b
print sumofdigits(5487123456789087654)
于 2018-04-25T04:19:12.983 回答
0

对于寻找非递归方式的人,

解决方案1:使用公式,

digits = int(input())
res = (digits * (digits + 1) // 2)

解决方案 2:使用基本语法

numbers = [6, 5, 3, 8, 4, 2, 5, 4, 11]

total = numbers[0]
print(f'{total}')
for val in numbers[1:]:
    print(f'{total} + {val} = {total + val}')
    total += val

6
6 + 5 = 11
11 + 3 = 14
14 + 8 = 22
22 + 4 = 26
26 + 2 = 28
28 + 5 = 33
33 + 4 = 37
37 + 11 = 48
于 2021-06-23T13:24:12.117 回答
-1

您仍然可以在 O(log10 n) 中执行此操作...取消所有加到 9 的数字,然后如果没有剩余数字,则 9 是答案,否则将所有遗漏的数字相加...

def rec_sum_Reduce(n) : ans = 0 for i in map(int,str(n)) : ans = 1+(ans+i-1)%9 return ans

于 2015-11-07T11:19:43.053 回答
-2

定义 drs_f(p):

 drs = sum([int (q) for q in str(p)])
 while drs >= 10:
     drs = sum([int(q) for q in str(drs)])
return drs
于 2012-08-24T19:32:14.237 回答
-3
def digitalSum(n):
   if n < 10:
      return n
   else:
      return ???

第一部分来自您现有的代码。这 ???是您需要解决的部分。它可以去掉一个数字n并将其添加到剩余数字的 digitalSum 中。

你并不真的需要else,但我把它留在那里所以代码结构看起来一样

于 2012-08-24T09:55:22.363 回答