我正在尝试编写一个递归函数(用于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
答案 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))