最近、プログラミングの授業で、任意の言語でプログラムを作成するという課題が与えられました。このプログラムは、nが与えられた場合、すべての i に対してp [i] != i: 0 となるような、サイズnの配列pに対して可能なすべての乱れを生成します。 <= i < n. イテレータを使用する必要がありました。yield
例: n=3、[0, 1, 2] は乱れではありませんが、[2, 0, 1] は [1, 2, 0] と同様です。
動作する疑似コード ソリューションを思いつきましたが、問題はパワー ループ (つまり、nが実行時にのみ認識されるn個のネストされたループ) が必要なことでした。これを行うために、文字列内の Ruby コードでn 個のネストされたループを生成し、文字列をeval
編集しました。私の解決策はうまくいきましたが、私の教授は、goto
動的コード生成よりも数個の s を使用する方が良い解決策 (少なくとも読みやすい) であると考えました。
goto
私はいつも悪い選択だったという印象を受けました。動的に生成されたコードの実行時評価が、なぜより悪い選択になるのgoto
でしょうか? 生成されたコードはクリーンでシンプルで、与えられた問題に対してかなり効率的です。コード生成が依存する唯一のユーザー入力はnであり、事前に整数値であることを確認するためにチェックされます。当然yield
のことながら、それは唯一の混乱です。
私は自分のプログラミング課題の解決策を求めているのではなく、goto
過剰な動的コード評価を使用する理由、またはその逆の使用の背後にある理由を知りたいだけです。
編集: 明確にするために、割り当てには反復子を使用したプログラムと再帰を使用した別のプログラムの作成が含まれていたため、反復バージョンは必ずしも効率的であるとは限りませんでした。