【问题标题】:Digital Root without loops Python没有循环的数字根 Python
【发布时间】:2020-01-26 03:25:23
【问题描述】:
def digit_sum(n):
    '''(int)->number
    Returns the sum of all the digits in the given integer, n'''
    if n<10:
        return n
    return n%10 + digit_sum(n//10)

def digital_root(n):
    '''(int)->number
    Returns the resulting sum of the digits in the given integer until it reaches a single digit number; via digit_sum'''
    while n>9:      
        n=sum(digit_sum(n))
    return n

写了digit_sum的代码,然后用递归写了digital_root。我该怎么办?任何帮助表示赞赏!

【问题讨论】:

  • 我真的很想知道,为什么教授讨厌循环?
  • 可能是递归练习?

标签: python


【解决方案1】:

Wikipedia 为数字根列出了一个简单的 O(1) 公式:

def digit_root(n): 
    return (n - 1) % 9 + 1

这里没有考虑输入小于1,所以可以修改如下,假设输入为整数:

def digit_root(n): 
    return (n - 1) % 9 + 1 if n else 0

例子:

>>> digit_root(1)
1
>>> digit_root(11)
2
>>> digit_root(235)
1

【讨论】:

    【解决方案2】:

    所以你的想法是你必须对最后一个使用递归?在这种情况下,这应该可以完成工作:

    def digital_root(n):
        if n < 10:
            return n
        return digital_root(digit_sum(n))
    

    【讨论】:

      【解决方案3】:

      试试这个:

      def num(n) :   
           sum = 0   #provided sum as 0
           for i in str(n): 
               a = int(n) % 10    #taken variable a 
               sum  = sum + a   #put the sum.
               n = n/10
           print(sum)    
           if sum < 10:    
               print(str(sum) + "=this is a digital root")
           else:
               num(sum)
      

      【讨论】:

        【解决方案4】:

        请尝试以下代码:

        def dgtl_rt(n):
           return n%9 or n and 9
        print(dgtl_rt(123))
        

        【讨论】:

        • hi shyam,你能解释一下它的作用吗?
        • 请给出更多解释以理解您的代码。
        【解决方案5】:
        def droot(a):
            while a>=10:
                 b =int(a/10) #other digit(s)
                 c =a-(b*10)  #the rightmost digit
                 a =b+c #add together
            return a
        

        我在任何地方都没有看到过这个解决方案,所以我觉得分享一下会很好,我自己发现了!只有 1 个循环结构。

        【讨论】:

          【解决方案6】:
          {def MDR(n):
              '''
              this function returns multiplicative digital root.
              '''
              count, mdr = 0, n 
              while mdr > 9:
                  m, digitsMul = mdr, 1
                  while m:
                      m, md = divmod(m, 10)
                      digitsMul *= md
                  mdr = digitsMul
                  count += 1
              return count, mdr}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-23
            • 2017-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多