Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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 3.x_Recursion - Fatal编程技术网

python中的Recaman序列

python中的Recaman序列,python,python-3.x,recursion,Python,Python 3.x,Recursion,我正试图在python中使用递归创建Recaman的序列,但我很难做到这一点 我知道雷卡曼的序列是如何运作的。在我的例子中,给定rec(n),如果值以前没有出现在序列中,则每n项等于前一项减去n,否则等于前一项减去n 这个问题的主要问题是如何“保存”每个rec(n)以检查它以前是否出现过,然后将现有的n与该值进行比较 到目前为止,我的代码没有显示太多内容,但我相信我必须添加一个参数,并使用包装函数/累积递归来实现这一点 这是我当前的代码,它肯定不起作用,但我正在尝试将值存储在列表中 def re

我正试图在python中使用递归创建Recaman的序列,但我很难做到这一点

我知道雷卡曼的序列是如何运作的。在我的例子中,给定rec(n),如果值以前没有出现在序列中,则每n项等于前一项减去n,否则等于前一项减去n

这个问题的主要问题是如何“保存”每个rec(n)以检查它以前是否出现过,然后将现有的n与该值进行比较

到目前为止,我的代码没有显示太多内容,但我相信我必须添加一个参数,并使用包装函数/累积递归来实现这一点

这是我当前的代码,它肯定不起作用,但我正在尝试将值存储在列表中

def rec(n):
列表=[]
如果n==0:
返回0
elif记录(n-1)-n在列表中:
列表。追加(记录(n-1)-n)
返回记录(n-1)-n
其他:
列表.附加(rec(n-1)+n)
返回记录(n-1)+n

如果需要无递归,您可以查看以下内容:

将numpy导入为np
国防部长雷卡曼(n):
系列=np.零(n)
系列[0]=0
对于范围(1,n)内的i:
如果系列[i-1]-i>0且系列[i-1]-i未串联:
系列[i]=系列[i-1]-i
其他:
系列[i]=系列[i-1]+i
返回序列

使用Python 3.8(walrus运算符)中的赋值表达式,您可以在一行代码中生成Recaman序列。不幸的是,它需要O(x^2)个时间:(

R=[0];[(R:=R+[R[-1]+x])如果R[-1]-x在R中或R[-1]
这提供了详细的解决方案。不要使用
集合
作为基础,而不是列表(搜索
集合
比搜索
列表
更快),并将集合作为参数传递到递归函数中,而不是在函数中初始化它。每次迭代,都向集合中添加新值。尽管有递归定义,但只迭代计算函数的值要容易得多。这是“我还没有真正学习过set()的一个简单应用程序”但是,我不确定这是否是一个允许我使用的函数。但是list可以做到吗?当然可以!它应该是这样的:
def rec_I(n,list):
在这个函数中,您可以像在
rec(n)中一样实现程序
,但不是创建一个新的空列表,而是将该项附加到作为参数发送的列表中,然后在return语句中使用它(
return rec_i(n-1,list)
)。在rec_i中实现整个算法后,您应该在
rec(n)
内部调用
rec(n)
类似
def rec(n):return rec rec(n,[])
R = [0]; [(R:= R + [R[-1]+x]) if R[-1]-x in R or R[-1] < x else (R := R + [R[-1]-x]) for x in range(1,100)]