You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

递归数字求和函数return语句中and运算符用法及return n必要性问询

关于递归函数sumDigitsnand运算符的解析

这是个很巧妙的递归写法,咱们一步步拆解来弄明白你的问题:

首先理解and运算符在Python中的行为

Python里的and短路求值的逻辑运算符,它的执行规则是关键:

  • 当左边表达式的布尔值为False时,直接返回左边的值,完全不会计算右边的表达式
  • 当左边表达式的布尔值为True时,才会计算并返回右边的值

在整数语境里,非0整数的布尔值是True,0的布尔值是False,这是这个递归能正常工作的核心前提。

为什么必须保留初始的n

咱们先看原函数的递归终止逻辑:
当递归到n=0时,nFalse,所以and直接返回n(也就是0),递归到此终止。

如果移除n,把函数改成:

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

当调用到sumDigits(0)时,会执行0%10 + sumDigits(0//10),也就是0 + sumDigits(0)——这就陷入了无限递归sumDigits(0)会不断调用自己,直到超过Python的递归深度限制,抛出RecursionError

原写法里的n本质上就是递归的终止条件:当n为0时,直接返回0,不再触发后续的递归调用。

整个函数的执行流程(以sumDigits(123)为例)

咱们走一遍完整的计算过程,更直观:

  1. sumDigits(123):123是True,返回123%10 + sumDigits(123//10)3 + sumDigits(12)
  2. sumDigits(12):12是True,返回2 + sumDigits(1)
  3. sumDigits(1):1是True,返回1 + sumDigits(0)
  4. sumDigits(0):0是Falseand直接返回0,递归终止

最终计算就是3+2+1+0=6,和预期的各位数字之和一致。

等价的展开写法

为了更清晰,这个递归函数其实等价于用if-else写的常规递归:

def sumDigits(n):
    if n == 0:
        return 0
    else:
        return n%10 + sumDigits(n//10)

只是利用and的短路特性,把代码压缩成了一行更简洁的形式。

内容的提问来源于stack exchange,提问作者Jack A Roe

火山引擎 最新活动