【问题标题】:a recursive function to calculate sum of a number digits一个递归函数来计算数字的总和
【发布时间】:2015-11-13 23:55:19
【问题描述】:

我必须编写一个递归函数来计算数字的总和,这是我尝试过的代码:

def sum_digit(n):
   sum=0
   a = n % 10
   n //= 10
   sum += a
   while n > 0 :
      sum = sum + sum_digit(n)
   return sum


print(sum_digit(67154))

我不知道为什么我没有得到 23 作为答案...我的程序没有结束

例如 23 数字(如果我错了请纠正我,我是 python 的新手),3 求和,n 变为 2,因为它 > 0 那么它应该去 while,所以现在它应该计算 sum digit(2),a 变成 2,2 变成 sum,n 变成 0,sum digit(2) 返回 2,然后它与 3 相加,我必须得到 5。 感谢您的帮助。

【问题讨论】:

  • while n > 0 你永远不会在循环中更改n。似乎您在这里混合了迭代和递归解决方案。
  • 尽管您将n 更改为n //= 10,但这只影响该函数中的n。您需要了解作用域和递归的工作原理才能理解这一点,但基本上修改 n 不会影响调用 sum_digit 的函数。
  • Tl;dr ... 将while 更改为if 并且不要使用sum 作为变量,因为它会掩盖内置函数。

标签: python


【解决方案1】:

你有一个无限循环,因为n 在循环内永远不会改变。请注意,在被调用函数的范围内为n 分配新值不会改变外部范围内的n

此外,您似乎将迭代解决方案与递归解决方案混合在一起。如果进行递归调用,则不需要循环,反之亦然。

您可以递归地执行此操作:

def sum_digit(n):
    if n > 0:
        return sum_digit(n // 10) + n % 10
    else:
        return 0

或者以迭代方式:

def sum_digit(n):
    s = 0
    while n > 0:
        s += n % 10
        n //= 10
    return s

或者只是使用 bultin 函数(可能不是你的老师想要看到的):

def sum_digit(n):
    return sum(map(int, str(n)))

【讨论】:

    【解决方案2】:

    我必须用 if 更改 while,它可以工作,感谢您的 cmets,很抱歉在这里发布这样的问题。

    【讨论】:

      【解决方案3】:

      这样就可以了:

      def sum_digit(n, current_sum=0):
          if n == 0:
              return current_sum
          else:
              digit = n % 10
              current_sum += digit
              n //= 10
              return sum_digit(n, current_sum)
      

      输出:

      print(sum_digit(67154))
      > 23
      

      您混淆了迭代方法(while 循环)和递归方法(函数调用)。

      在递归函数中,必须确保你做对了这些事情:

      结束条件(在我们的例子中,当数字为0时我们返回总和)

      递归调用(在我们的例子中,每次下降一位)

      【讨论】:

        【解决方案4】:

        如下修改你的代码:

        def sum_digit(n):
           sum=0
           a = n % 10
           n //= 10
           sum += a
           if n > 0 :
              sum = sum + sum_digit(n)
           return sum
        

        原因是 n 在函数内部被分配了新的引用,但它在外部是不可见的。所以 while part is loop 死了。实际上,虽然部分最多执行一次,所以代码改成如上。

        【讨论】:

          猜你喜欢
          • 2013-11-26
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 2013-11-29
          • 1970-01-01
          • 2018-06-29
          • 1970-01-01
          • 2014-02-13
          相关资源
          最近更新 更多