问题描述
我有兴趣创建一个列表,其术语是递归定义的(即 term[i]
是 term[i-1]
的函数,不是 i-1
的函数)。
我认为如果 makelist
连续工作,那么调用前一个术语应该不是问题;但是,the documentation 没有明确说明这些条款是如何生成的。
初步尝试(注意:即使这里的输出可以使用索引的函数来实现,重点是创建一个简单的示例来测试在 makelist
内调用先前术语的能力):
test:
makelist(block([ ],/* list item set to 1 for first term of the list,and to prevIoUs list item,thereafter */
if i = 1
then addend
else test[i-1]
),i,5);
但这会返回 [1,test[1],test[2],test[3],test[4] ]
,因此它似乎并未实际访问 test
的值。
我尝试了各种实验,包括初始化test
;包括对块中的 test 的调用,即 block([ test:test ],...
和其他一些,但未能获得所需的结果。
解决方法
这是一个很好的问题。 makelist
的结果与分配给它的变量无关(在上面的例子中为 test
),所以当 makelist
构造它的结果时,没有办法知道test[i - 1]
是前一项。我认为没有任何方法可以从 makelist
中访问前一项(例如,通过某些 Lisp 编程或其他方式)。
关于 makelist
是串行还是并行,我 99% 确定元素是按顺序构造的。例如。 makelist(print(i),i,1,10)
打印从 1 到 10 的数字。
如果一个术语依赖于前一个术语,一种方法是创建一个空列表(例如 x: makelist(0,n)
),然后循环遍历元素(例如 x[1]: FOO; for i:2 thru n do x[i]: x[i - 1] + something
)。