2009-10-14 7 views
1

Mathematica a une fonction MapThread qui se comporte comme ceci:Comment implémenter MapThread avec le mappage de liste de base?

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

Je voudrais mettre en œuvre cette TeX, qui possède des installations de programmation très primitives. J'ai des facilités de base pour itérer sur des listes, mais pas d'indexation logique. Compte tenu de cette restriction, existe-t-il un algorithme permettant de boucler de manière synchrone sur plusieurs listes?

je pourrais écrire quelque chose comme ce qui suit: (pseudocode)

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 

mais il semble terriblement inefficace. Notez que la grande restriction est que je ne peux pas accéder à des éléments de listes numériquement, donc quelque chose comme ce qui suit est trop « haut niveau »:

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

La raison pour laquelle cette restriction est en place est que pour mettre en œuvre list1(ii) Je dois écrire quelque chose comme ce qui suit en premier lieu:

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

Ou est le cas inefficace probablement le meilleur que je serai en mesure de le faire avec une telle langue primitive?

+0

Pouvez-vous faire l'équivalent de First [] et Rest [] sur ces listes, et tester si elles ont une longueur nulle? Dans ce cas, ce n'est pas si difficile. Sinon, votre astuce N^2 est probablement la meilleure solution sans morceler vos propres macros pour manipuler les listes. – Pillsy

+0

D'abord [] et reste [] sont possibles, oui. Ah, je pense que je vois où tu vas avec ça. –

Répondre

2

En pseudocode, aussi longtemps que vous pouvez vérifier si une liste est vide, vous pouvez le faire comme ceci:

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 

Il est toujours ne va pas gagner de concours de beauté, mais il va faire le travail fait sans être terriblement inefficace.