2012-08-24 431 views
4

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

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更改为海峡。你可以帮我吗?

回答

9

试试这个:

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 
+2

发布的代码片段,没有解释没有回答功课questio的最佳方式纳秒。考虑阅读http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework-questions – georg

+0

我会尽量在将来更有帮助,虽然有这样一小段代码没什么好说的。 – Grampa

+0

非常感谢!现在我明白了。 – Reginald

1

一些提示:

  1. 您可以在Python定义的内部函数
  2. 可以使用模运算符(它的语法和用法查找),效果良好,这里
  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) 

这可能有点太多了,但即使在学习情况下访问一个答案也是有益的。

我的解决方案比一些更冗长,但它对tail call optimizing compiler也更友好,我认为这是一项功能。

+0

我认为我的解决办法是更优雅;) –

3

这是作业,所以我不写很多代码。递归可以通过以下方式使用:

  • 得到第一个(或最后一个)数字
  • 格式,其余为短号码
  • 添加数字和稍短一些的数字总和( !递归)
-2
def digitalSum(n): 
    if n < 10: 
     return n 
    else: 
     return ??? 

的第一部分是从现有的代码。 The ???是你需要制定的部分。它可能会从n取下一位数字,并将其添加到剩余数字的数字和。

你并不真正需要的else,但我离开那里,使代码结构看起来相同

3

这是更相关的算法问题。

这里是你的答案:

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

让我知道,如果你不明白为什么它的作品,我会提供一个解释。

+0

将它添加到python 3,它工作,但我不明白什么是digitalSum(a // 10),它似乎是digitalSum(n // 10)!= n // 10,所以wath是digitalSum()? – Reginald

0
def digital_sum(number): 
    if number < 10: 
     return number 
    else: 
     return number % 10 + digital_sum(number/10) 
-1

高清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 
-1

你仍然可以做到在O(日志10 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