首页 > 解决方案 > (wx)Maxima:`makelist` 是并行工作还是串行工作?

问题描述

我有兴趣创建一个列表,其术语被递归定义(即term[i]是 的函数term[i-1]而不是的函数i-1)。

我认为如果makelist连续工作,那么调用上一个术语应该不是问题;但是,文档没有明确说明这些术语是如何生成的。

初步尝试(注意:尽管此处的输出可以使用索引的函数来实现,但重点是创建一个简单的示例来测试在 内调用先前术语的能力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 , ieblock([ test:test ], ... 和其他一些,但未能获得所需的结果。

标签: listrecursionmaximawxmaxima

解决方案


这是一个很好的问题。的结果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)。


推荐阅读