1

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

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

4

1 回答 1

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

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

于 2009-10-15T15:29:53.270 回答