Python递归函数不能正确计数零

vohkndzv  于 12个月前  发布在  Python
关注(0)|答案(3)|浏览(123)

下面的递归代码应该计算一个数中零的个数

def re(x,ans):
    if x //10 == 0:
        return 
    rem = x % 10
    if rem == 0:
        ans += 1
    re(x//10,ans)
    return ans

print(re(2002,0))

字符串
上面的代码给出0作为答案。它不应该打印2吗?我错过了什么...

gopyfrb3

gopyfrb31#

你也可以考虑如果一个数字小于10,你有一个个位数,因此返回0,否则递归。

def count0(x):
    return 0 if x < 10 else (x % 10 == 0) + count0(x//10)

print(count0(2002))
2

字符串

uurity8g

uurity8g2#

上面代码的问题是,ans的值在re函数的每次递归调用中都没有正确更新。要解决这个问题,您需要更新ans的值,并在递归调用中将其作为参数返回。此外,在调用递归函数时,您应该包括return语句。
下面是正确的代码:

def re(x, ans):
    if x // 10 == 0:
        return ans
    
    rem = x % 10
    if rem == 0:
        ans += 1
        
    return re(x // 10, ans)

print(re(2002, 0))

字符串
此代码计算输入数字x中的零位数。通过调用print(re(2002, 0)),输出将为2,即数字2002中的零位数。

p8h8hvxi

p8h8hvxi3#

当你递归调用时,每个递归调用必须返回它从下一层得到的值:

def re(x,ans):
    if x //10 == 0:
        return ans
    rem = x % 10
    if rem == 0:
        ans += 1
    return re(x//10, ans)

print(re(2002,0))

字符串
当它到达终点,电话解除,最终的答案得到补充到顶部。
在这种情况下,您甚至不需要ans参数:

def re(x):
    if x //10 == 0:
        return 0
    rem = x % 10
    return re(x//10) + (rem == 0)

print(re(2002))

相关问题