0

当我想到在 return 语句中实现运算符时,我试图解决这个问题。这是问题:

数字根是一个数字中所有数字的递归和。给定n,取n的位数之和。如果该值超过一位,则继续以这种方式减少,直到产生一位数。输入将是一个非负整数。 例子:

  1. 16 --> 1 + 6 = 7
  2. 493193 --> 4 + 9 + 3 + 1 + 9 + 3 = 29 --> 2 + 9 = 11 --> 1 + 1 = 2
  3. 942 --> 9 + 4 + 2 = 15 --> 1 + 5 = 6

代码:

def digital_root(n):
    return w:=sum(int(x) for x in str(n)) if w<10  else digital_root(w)
4

2 回答 2

2

要使用海象运算符,您应该将其放在if条件为:

def digital_root(n):
    return w if (w := sum(int(x) for x in str(n))) < 10 else digital_root(w)

这基本上是一个较短的版本:

def digital_root(n):
    if (w := sum(int(x) for x in str(n))) < 10:
        return w 
    else:
        return digital_root(w)
于 2021-07-10T10:23:39.947 回答
0

你太专注于“短”代码而没有意识到你正在做出愚蠢的决定。如果str—— _ int_ _sumn < 10

def digital_root(n):
  if n < 10:
    return n
  else:
    return digital_root(sum(int(x) for x in str(n)))

要“缩短”它,您可以使用条件表达式-

def digital_root(n):
  return n if n < 10 else digital_root(sum(int(x) for x in str(n)))

但是看看你如何将数字转换为字符串并立即使用int? 我知道您这样做是为了利用字符串的可迭代属性,但是您可以为数字编写一个简单的迭代器并完全跳过类型转换-

def digits(n):
  yield n % 10
  if n >= 10: yield from digits(n // 10)

def digital_root(n):
  return n if n < 10 else digital_root(sum(digits(n)))

这样做的好处是显而易见的。不仅digital_root更容易编写,而且您还有一个有用的digits功能,该功能在任何其他需要这种数字功能的程序中都很有用。

print(digital_root(16))
print(digital_root(493193))
print(digital_root(942))
7
2
6
于 2021-07-10T14:11:47.773 回答