【问题标题】:Digital sum, Python数字和,Python
【发布时间】:2012-08-24 09:49:02
【问题描述】:

我需要编写一个代码来计算一个数字的数字之和,这就是问题的确切文本:数字 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。你能帮帮我吗?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    试试这个:

    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
    

    【讨论】:

    • 发布没有解释的代码 sn-p 并不是回答作业问题的最佳方式。考虑阅读meta.stackexchange.com/questions/10811/…
    • 以后我会尽量提供更多帮助,虽然这么小的一段代码没什么好说的。
    • 非常感谢!现在我明白了。
    【解决方案2】:

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

    • 获取第一个(或最后一个)数字
    • 将其余部分格式化为较短的数字
    • 添加数字和较短数字的数字和(递归!)

    【讨论】:

      【解决方案3】:

      这更像是一个与算法有关的问题。

      这是你的答案:

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

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

      【讨论】:

      • Uptadet 到 python 3,它工作,但我不明白什么是 digitalSum(a//10) ,似乎 digitalSum(n//10) != n//10,那么 digitalSum() 是什么?
      【解决方案4】:

      一些提示:

      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 也更友好,我认为这是一个功能。

      【讨论】:

      • 我认为我的解决方案更优雅 ;)
      【解决方案5】:
      def digital_sum(number):
          if number < 10: 
              return number
          else:
              return number % 10 + digital_sum(number / 10) 
      

      【讨论】:

        【解决方案6】:
        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)
        

        【讨论】:

        • 请将此作为完整的答案,而不仅仅是没有解释的代码答案。
        【解决方案7】:

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

        解决方案 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
        

        【讨论】:

          【解决方案8】:

          您仍然可以在 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

          【讨论】:

            【解决方案9】:

            定义 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
            

            【讨论】:

              【解决方案10】:
              def digitalSum(n):
                 if n < 10:
                    return n
                 else:
                    return ???
              

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

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

              【讨论】:

                猜你喜欢
                • 2015-06-03
                • 1970-01-01
                • 1970-01-01
                • 2016-04-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多