Il semble tout à fait prête à une mise en œuvre récursive:
mergeQueues :: Queue a -> Queue a -> Queue a
mergeQueues qa qb =
merge qa qb emptyQueue
where
merge qa qb qr
| isEmpty qa = append qb qr
| otherwise = move (merge qb) qa qr
append q qr
| isEmpty q = qr
| otherwise = move append q qr
move f q qr =
let (val,q') = pop q
in f q' (push val qr)
Notez que nous suffit de retourner les files d'attente avant et en arrière comme nous RECURSE afin d'alterner entre eux, jusqu'à ce que l'un est vide, à quel point nous venons joindre de l'un à l'autre. Notez que, bien que ce soit plus long que la version impérative donnée par ribond, cela fait un nombre minime de vérifications isEmpty
Si cela ne vous dérange pas de faire autant de contrôles que le sien dans une version légèrement plus optimisée (en associant les valeurs isEmpty aux variables pour réutilisation ci-dessous), vous pouvez supprimer la fonction append
et continuer à appeler merge
à la place, après avoir ajouté une initiale. test à merge
qui vérifie que les deux files d'attente sont vides et termine la récursivité si c'est le cas.
Pour ceux qui ne sont pas familiers avec Haskell, nous passons pour déplacer la fonction suivante à appeler (c'est la programmation fonctionnelle d'ordre supérieur); dans le cas append
, c'est juste ajouter, dans le cas move
qui est une fonction de déplacement "partiellement appliquée": il obtient le premier paramètre, qb
appliqué avant d'appeler move
, puis move
applique les deux autres paramètres.
Cela semble être une tâche raisonnable que l'on pourrait rencontrer dans la programmation d'entreprise au jour le jour. Cependant, si c'est une fonction de devoir, je vous suggère d'étudier attentivement comment le code ci-dessus fonctionne, et je pense que vous apprendrez quelque chose.
En outre, il existe une possibilité d'erreur dans le code ci-dessus; prouver que cela fonctionne (ou trouver le bug) serait un excellent exercice.
Que voulez-vous faire lorsqu'une file d'attente s'épuise plus tôt que l'autre? Arrêtez? Continuez, en ignorant les éléments manquants de la courte file d'attente? Continuez, en mettant des éléments null à la place des éléments manquants? –