【问题标题】:How to sum up the number's digits? [duplicate]如何总结数字的位数? [复制]
【发布时间】:2021-01-09 11:28:34
【问题描述】:

我在 Python 中有这个函数可以帮助我找到数字的数字之和:

def sum01(n):
    if n < 9 and n > 0:
        return n
    elif n > 9:
        s = sum01((n%10)+(n//10))
        return s
    else:
        return "ERROR, only natural numbers (N)!"

    print(sum01(22224))

这个函数给出的结果是:

3

但是,我希望看到的结果是:

12

我想在不使用whilefor 循环且没有列表的情况下使用递归函数得到这个答案,但是,我一直没有这样做。

谢谢!

我无法添加我一直在寻找的解决方案作为答案,所以它在问题中。

`def sum01(n):
   x = 0
   if n < 9 and n > 0:
       return n
   elif n > 9:
       x = (n%10) + x
       s = sum01(n//10)
       return s + x
   else:
       return "ERROR, only natural numbers (N)!"`

【问题讨论】:

  • 为什么要 12 个? 2+2+2+2+4 -> 12,然后是 1+2 -> 3。
  • 用你自己的话说,你觉得这个函数是如何工作的?为什么,具体来说,你认为它给你 3 而不是 12?您是否尝试过手动追踪其逻辑?如果你这样做了,你可能会发现有一个 12 计算的点。也许只是……停在那里?我注意到你用recursion 标记了这个问题。您是否有特定的原因需要递归来解决问题?为什么?您将如何手动解决问题?您的解决方案是否涉及将问题分解为更小的问题?
  • 这一行的括号错误:s = sum01((n%10)+(n//10))。它应该是:s = sum01(n//10) + (n%10)。说明:n%10 是个位数的值。 n//10 是“没有个位”的数字。您想将个位数的值与剩余数字的总和相加。例如如果n = 8964,那么n%10 == 4n//10 == 896。在这种情况下,递归调用应该是 sum01(8964) = sum01(896) + 4 而不是 sum01(8964) = sum01(4 + 896)
  • “我正在寻找一种没有 for 或 while 循环的递归函数的方法。”如果目标是为了学习递归而学习递归,作为替换循环的一种方式:诀窍是传递两个参数,以便将“到目前为止的总和”与“剩余数字”分开,并避免一旦超过 9 就“处理”总和。
  • 尝试将how to think recursively 放入搜索引擎;那里有很多好材料。

标签: python recursion sum digits


【解决方案1】:

这不是最好或最高效的解决方案,但如果您只需要快速完成它,它会相当短:

sum_of_digits = 0
for digit in str(22224):
  sum_of_digits += int(digit)

如果你想给某人留下深刻印象,你也可以使用这个“单线”:

from functools import reduce
reduce(lambda a, b: int(a) + int(b), str(22224))

但@ekhumoro 解决方案更好(参见 cmets)。

无论如何,这有点像递归地模仿reduce,不涉及循环:

def sum_of_digits(sum, digits):
    sum += int(digits.pop())
    if len(digits) == 0:
        return sum
    return sum_of_digits(sum, digits)

print(sum_of_digits(0, list(str(22224))))

我想这会更干净一些:

def sum_of_digits(sum, number):
    if number == "":
        return sum
    digits = str(number)
    return sum_of_digits(sum + int(digits[0]), digits[1:])

print(sum_of_digits(0, 22224))

【讨论】:

  • 不要使用sum作为变量名,它是一个内置函数。
  • 我正在寻找一种没有forwhile 循环的递归函数的方法。谢谢!
  • @MajedSaaeddin 无循环:sum(map(int, str(22224))).
  • @buran 你是完全正确的。我改变了它。感谢您指出这一点。
  • 我已经阅读了每个人的 cmets 并想出了我一直在寻找的灵魂。大家的cmet对我帮助很大。但是,我不能在这里发布解决方案作为答案。所以我只会粘贴到问题本身,因为粘贴到这里是行不通的。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2017-12-01
  • 2014-03-05
相关资源
最近更新 更多