Supposons que vous travaillez dans une langue avec des tableaux de longueur variable (par exemple avec A[i]
pour tous i
en 1..A.length
) et doivent écrire une routine qui prend n
(n : 1..8
) tableaux de longueur variable d'éléments dans un tableau de longueur variable de longueur n
, et doit appeler une procédure avec chaque longueur possible n
tableau d'éléments où le premier est choisi dans le premier tableau, le second est choisi dans le second tableau, et ainsi de suite.Quel est un bon moyen de structurer des boucles imbriquées variables?
Si vous voulez quelque chose de concret pour visualiser, imaginez que votre routine doit prendre des données comme:
[ [ 'top hat', 'bowler', 'derby' ], [ 'bow tie', 'cravat', 'ascot', 'bolo'] ... ['jackboots','galoshes','sneakers','slippers']]
et faire les appels de procédure suivants (dans l'ordre):
try_on ['top hat', 'bow tie', ... 'jackboots']
try_on ['top hat', 'bow tie', ... 'galoshes']
:
try_on ['derby','bolo',...'slippers']
C'est parfois appelé un problème de menu chinois, et pour n
fixe peut être codé tout simplement (par exemple pour n
= 3, en pseudo code)
procedure register_combination(items : array [1..3] of vararray of An_item)
for each i1 from items[1]
for each i2 from items[2]
for each i3 from items[3]
register([ii,i2,i3])
Mais si n
peut varier, en donnant comme une signature:
procedure register_combination(items : vararray of vararray of An_item)
Le code comme écrit contenait une déclaration de cas laid, que je remplacée par une solution beaucoup plus simple. Mais je ne suis pas sûr que ce soit le meilleur (et ce n'est certainement pas le seul) moyen de refactoriser cela.
Comment le feriez-vous? Intelligent et surprenant sont bons, mais clair et maintenable sont meilleurs - je suis juste en train de passer ce code et je ne veux pas être rappelé. Concis, clair et intelligent serait idéal.
Editer: Je posterai ma solution plus tard aujourd'hui, après que d'autres aient eu la chance de répondre.
Résumé: J'ai essayé de vendre une solution récursive, mais ils ne voulaient pas y aller, alors j'ai dû m'en tenir à l'écriture fortran dans un HLL.
La réponse que je suis allé avec, posté ci-dessous.
Je ne vois pas comment cela n'est pas récursif ... vous appelez register_combination() depuis register_combination(), non? –