Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带递归的Recaman_Python_Python 2.7_Recursion - Fatal编程技术网

Python 带递归的Recaman

Python 带递归的Recaman,python,python-2.7,recursion,Python,Python 2.7,Recursion,这对你来说可能是个简单的问题,但我找不到解释: 如果我只打印recaman(6)输出是13,这是真的,但是如果我同时打印recaman(5)和recaman(6),输出是7和11,这应该是7和13。这是为什么?问题在于列表是全局定义的,因此在调用recaman后,对函数的下一次调用会产生意外的结果,因为列表中仍有项: lst = [] def recaman(n): #print lst if n == 1: lst.append(n) return 1 else:

这对你来说可能是个简单的问题,但我找不到解释:
如果我只打印
recaman(6)
输出是
13
,这是真的,但是如果我同时打印
recaman(5)
recaman(6)
,输出是
7和11
,这应该是
7和13
。这是为什么?

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

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
函数将列表作为参数。然后可以在递归调用中传递此列表。最初你会用一个空列表来调用它。因此,最终代码变成:

print(recaman(5)) # 7
print(lst) # [1, 3, 6, 2, 7]
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