递归函数来计算11是否除数

时间:2019-02-20 22:58:21

标签: python algorithm recursion

我正在尝试编写一个递归函数(用于Python)以计算11是否在不使用余数的情况下将数字除以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

4 个答案:

答案 0 :(得分:1)

让我们将设计翻转为(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)

现在,我们总是返回布尔值,而不是以前的布尔和整数混合结果!

答案 1 :(得分:0)

它应该严格递归吗?不允许迭代吗?为了避免将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)))

答案 2 :(得分:0)

不完全是您要查找的内容,但是您可以修改函数以计算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

答案 3 :(得分:0)

对于纯递归(这只是一个变量),这是迄今为止我能做的最好的事情。如果字符串的值等于零mod 11或否则为数字,则它将返回布尔值True。

def f(s):
  if not s:
    return True

  r = f(s[1:])

  # If the rest of the string evaluates to
  # to zero mod 11, there's no need to
  # subtract it from the prefix.
  if isinstance(r, bool):
    return s[0]

  n = int(s[0]) - int(r)

  return True if n in [-11, 11, 0] else n

for x in ['11', '121', '54734', '1099989', '12', '65637', '1565432', '2345651']:
  print (x, f(x))