我使用下面的简单递归函数将数字中的所有数字加在一起。我的问题是为什么最初的'返回n'需要(没有它就行不通)而不是仅仅去n%10?
def sumDigits(n):
return n and n%10 + sumDigits(n//10)
sumDigits(123)
感谢。
答案 0 :(得分:3)
每个递归函数都必须具有基本情况,否则递归会一直持续到达到堆栈的极限。在这种情况下,基本情况或函数的停止点确定已添加所有数字(即n == 0
)。
所以,
def sumDigits(n):
return n and n % 10 + sumDigits(n // 10)
可以(并且应该)重写为:
def sumDigits(n):
if n == 0:
return n
return n % 10 + sumDigits(n // 10)
在这种情况下,已使用if
条件明确说明基本案例。
然而,在第一种情况下,开发人员已经利用了"真实性" of of int和and
逻辑运算符的行为。有关更多信息,请参阅Strange use of python's 'and' operator。 and
在第一个场景中的工作描述为:
如果有,则返回第一个Falsey值,否则返回最后一个 表达式中的值。
" Falsey"值包括0和0.0(与您的问题相关)等。当n == 0
时,返回表达式短路和0。否则,将评估并返回and
右侧的第二个表达式。