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 に答える