可変長配列 ( A[i]
for all i
inなど) を使用する言語で作業していて、 length の可変長配列内の項目の( ) 可変長配列を受け取る1..A.length
ルーチンを作成する必要があり、すべてのプロシージャを呼び出す必要があるとします。最初の配列から最初の配列が選択され、2 番目の配列から 2 番目の配列が選択されます 。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']
これは中国語のメニューの問題と呼ばれることもあり、for fixedn
は非常に簡単にコーディングできます (たとえばn
、疑似コードで for = 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)
書かれているコードには見苦しい case ステートメントが含まれていましたが、これをより単純なソリューションに置き換えました。しかし、これがリファクタリングの最良の方法であるかどうかはわかりません (そして、これが唯一の方法ではないことは確かです)。
どのようにしますか?巧妙で驚くべきことは良いことですが、明確で保守しやすいことはより優れています。私はこのコードを通過しているだけで、コールバックされたくありません。簡潔で、明確で、賢いことが理想的です。
編集: 他の人が応答する機会があった後、今日の後半にソリューションを投稿します。
Teaser: 私は再帰的なソリューションを売り込もうとしましたが、彼らはそれを受け入れなかったので、HLL で fortran を書くことに固執しなければなりませんでした。
私が行った答えは、以下に投稿されています。