Python 递归函数未正确计算零

Python recursive function not counting zeros correctly

提问人:Shashank Mingwal 提问时间:11/18/2023 最后编辑:Tim RobertsShashank Mingwal 更新时间:11/18/2023 访问量:60

问:

下面的递归代码应该算不。数字中的零

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 吗?我错过了什么......

python-3.x 递归

评论

3赞 Goku - stands with Palestine 11/18/2023
你的第一次回归是什么?return
2赞 inspectorG4dget 11/18/2023
return str(x).count)'0')?
0赞 Onyambu 11/18/2023
@inspectorG4dget我相信问题希望您只使用整数而不是将整数转换为字符串
1赞 Abdul Aziz Barkat 11/18/2023
提示:每次调用时,在其内部声明的任何变量都有单独的作用域。re
0赞 ggorlen 11/18/2023
递归不是解决这个问题的好方法。不过,我猜这是那些任意的人为分配要求之一。请考虑选择一个明确的函数名称,例如 . 不应成为签名的一部分。在递归中,依赖项向下传递,结果向上传递。count_zeros(number)ans

答:

0赞 Tim Roberts 11/18/2023 #1

当您以递归方式调用时,每个递归调用都必须返回它从下一层获得的值:

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))
-1赞 MuGhasemi 11/18/2023 #2

上述代码的问题在于,在函数的每个递归调用中,值未正确更新。若要解决此问题,需要更新 的值并将其作为递归调用中的参数返回。此外,在调用递归函数时,应包括 return 语句。ansreans

下面是更正后的代码:

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))

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

0赞 Onyambu 11/18/2023 #3

您还可以考虑,如果一个数字小于 10,则您只有一位数,因此返回 0,否则递归。这将产生以下代码

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

print(count0(2002))
2