递归函数计算如果11除一个数

2024-04-20 11:47:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个递归函数(使用Python)来计算如果11除以一个数字而不使用rest,减去11。我只需要使用这个规则https://en.wikipedia.org/wiki/11_(number)

代码有效,但是。。我想知道是否有办法缩小它,也许不需要变量“k”?你知道吗

def f(n, k=0):
    if n=="" : return 0
    t = ((-1)**(len(n)-1))*int(n[0]) + f(n[1:],k+1)
    if k == 0:
        if t <= -11 or t >= 11:
            return f(str(abs(t)))
        elif t == 0:
            return True
        else:
            return False
    return t

Tags: 代码httpsorgrestnumberlenreturnif
3条回答

不完全是您想要的,但是您可以修改您的函数来计算n mod m的结果,然后检查它是否为零。类似的事情可以简化为:

def mod11(n):
    if not n: return 0
    diff = int(n[-1]) - mod11(n[:-1])
    if diff < 0: diff = diff and 11 - mod11(str(-diff))
    return diff

用法:

>>> mod11("242311") == 0
False
>>> not mod11("242311")
False
>>> not mod11("242308")
True

它应该是严格递归的吗?不允许迭代?为了避免使用k作为递归深度,可以采用半递归的方法,通过迭代计算t,并使用递归来减少t

def f(n):
    t = 0
    for i in range(len(n)):
        t += (-1)**(i)*int(n[i])

    if t == 0 :
        return True
    if t < 11 and t > -11:
        return False

    return f(str(abs(t)))

让我们把设计转换成一个(n个未优化的)尾部递归,因此我们不使用k来检测返回到顶层,而是向下传递t的增长值,并在到达基本情况时进行最终计算:

def f(n, t=0):
    if not n:
        if -11 < t < 11:
            return t == 0

        return f(str(abs(t)))

    return f(n[1:], int(n[0]) - t)

现在我们总是返回一个布尔值,而不是之前的布尔值和整数混合结果!你知道吗

相关问题 更多 >