lst = []
def recaman(n):
  #print lst
  if n == 1:
    lst.append(n)
    return 1
  else:
    a = recaman(n-1)
    am = a - n
    ap = a + n
    if am > 0 and am not in lst:
      lst.append(am)
      return am
    else:
      lst.append(ap)
      return ap
  #print lst
  #lst.append(temp)
#print recaman(1)
#print recaman(2)
#print recaman(3)
#print recaman(4)
#print recaman(5)
print recaman(6)
#13


这对您来说可能是个简单的问题,但我找不到对此的解释:
如果我仅打印recaman(6),则输出为13,这是正确的;但是,如果我同时打印recaman(5)recaman(6),则输出为7 and 11,应为7 and 13。为什么是这样?

最佳答案

问题在于该列表是全局定义的,因此在调用recaman之后,对该函数的下一次调用会产生意外结果,因为该列表中仍包含项:

print(recaman(5)) # 7
print(lst) # [1, 3, 6, 2, 7]




有许多可能的解决方案,但是一个简单,优雅的解决方案(我认为)是使recaman函数将列表作为参数。然后可以在递归调用中传递此列表。最初,您将使用一个空列表来调用它。因此,最终代码变为:

def recaman(n, lst):
  if n == 1:
    lst.append(n)
    return 1
  else:
    a = recaman(n-1, lst)
    am = a - n
    ap = a + n
    if am > 0 and am not in lst:
      lst.append(am)
      return am
    else:
      lst.append(ap)
      return ap

print(recaman(5, [])) # 7
print(recaman(6, [])) # 13

关于python - Recaman递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59922987/

10-12 14:20