在此return语句中使用和运算符

时间:2018-04-15 00:26:55

标签: python recursion

我使用下面的简单递归函数将数字中的所有数字加在一起。我的问题是为什么最初的'返回n'需要(没有它就行不通)而不是仅仅去n%10?

def sumDigits(n):
    return n and n%10 + sumDigits(n//10)  
sumDigits(123)

感谢。

1 个答案:

答案 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' operatorand在第一个场景中的工作描述为:

  

如果有,则返回第一个Falsey值,否则返回最后一个   表达式中的值。

" Falsey"值包括0和0.0(与您的问题相关)等。当n == 0时,返回表达式短路和0。否则,将评估并返回and右侧的第二个表达式。