Предположим, вы работаете в языке с массивы переменной длины (например, с A[i]
для всех i
в 1..A.length
) и должны написать программу, которая принимает n
(n : 1..8
) переменной длины массивы элементов в переменной массива длины длины n
, и нужно вызвать процедуру с любой возможной длиной n
массив элементов, где первый выбран из первого массива, второй выбран из второго массива и т. д.Что такое хороший способ структурирования переменных вложенных циклов?
Если вы хотите что-то конкретное для визуализации, представьте, что ваша процедура должна принимать данные, такие как:
[ [ 'top hat', 'bowler', 'derby' ], [ 'bow tie', 'cravat', 'ascot', 'bolo'] ... ['jackboots','galoshes','sneakers','slippers']]
и сделать следующие вызовы процедур (в любом порядке):
try_on ['top hat', 'bow tie', ... 'jackboots']
try_on ['top hat', 'bow tie', ... 'galoshes']
:
try_on ['derby','bolo',...'slippers']
Это иногда называют проблемой китайского меню, а для фиксированного n
можно кодировать достаточно просто (например, для n
= 3, в псевдокоде)
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])
Но что, если n
может варьироваться, давая подпись как:
procedure register_combination(items : vararray of vararray of An_item)
Код, как написано содержал некрасивый случай заявление, которое я заменил с гораздо более простым решением. Но я не уверен, что это лучший (и это не единственный способ) реорганизовать это.
Как вы это сделаете? Умные и удивительные хорошо, но ясны и удобны в обслуживании - я просто прохожу через этот код и не хочу, чтобы меня перезвонили. Краткий, ясный и умный был бы идеальным.
Редактировать: Я опубликую свое решение позже сегодня, после того, как у других был шанс ответить.
Тизер: Я попытался продать рекурсивное решение, но они не пошли бы на это, поэтому мне пришлось придерживаться написания fortran в HLL.
Ответ, с которым я пошел, размещен ниже.
Я не вижу, как это не рекурсия ... вы вызываете register_combination() из register_combination(), правильно? –