如何使用基本列表映射实现MapThread?

时间:2009-10-14 02:11:57

标签: algorithm list wolfram-mathematica tex

Mathematica有一个函数MapThread,其行为如下:

MapThread[ f , { {a,b,c} , {d,e,f} } ]
-> { f[a,d] , f[b,e] , f[c,f] }

我想在TeX中实现它,它具有非常原始的编程功能。我有迭代列表的基本工具,但没有逻辑索引。鉴于此限制,是否存在通过多个列表同步循环的算法?

我可以写下面的内容:(伪代码)

ii = 0; jj = 0;
for elem1 in list1
  ii = ii+1
  for elem2 in list2
    jj = jj+1
    if ii == jj
      return ( elem1 , elem2 )
    fi
  end
end

但看起来非常低效。请注意,最大的限制是我无法以数字方式访问列表元素,因此类似下面的内容太“高级”:

for ii = 1:length(list1)
  func ( list1(ii) , list2(ii) )
end

这个限制到位的原因是,为了实现list1(ii),我首先需要编写如下内容:

jj = 0
for elem1 in list1
  jj = jj+1
  if ii=jj
    return elem1
  fi
end

或者效率低下的情况可能是我能用这种原始语言做的最好的情况吗?

1 个答案:

答案 0 :(得分:2)

在伪代码中,只要您可以测试列表是否为空,就可以这样做:

while (list1 is not empty) and (list2 is not empty)
  x1 = first(list1);
  x2 = first(list2);
  list1 = rest(list1);
  list2 = rest(list2);

  func(x1, x2);
end while

它仍然不会赢得任何选美比赛,但它会完成工作而不会非常低效。