Недавно для класса программирования нам было дано задание написать программу на любом языке, который при n произведет все возможные отклонения для массива p размера. n такое, что p [i]! = I для всех i: 0 <= i <n. Нам пришлось использовать итераторы, например, <code>yield.
Пример: n = 3, [0, 1, 2] не является нарушением, но [2, 0, 1] также как и [1, 2, 0].
Я предложил решение с псевдокодом, которое бы работало, но проблема заключалась в том, что для этого требовались петли питания (т. Е. n вложенные петли, в которых n известен только во время выполнения) , Для этого я сгенерировал n вложенных циклов в коде Ruby в строке, а затем eval
-ed строку. Мое решение работало, однако мой профессор подумал, что использование нескольких goto
с было бы лучшим решением (по крайней мере, легче читаемым), чем динамическая генерация кода.
У меня сложилось впечатление, что goto
всегда был плохим выбором. Почему оценка динамически сгенерированного кода во время выполнения может быть хуже, чем goto
? Сгенерированный код является чистым и простым, и кажется довольно эффективным для данной проблемы. Единственный пользовательский ввод, от которого зависит генерация кода, это n , который проверяется, чтобы заранее убедиться, что это целочисленное значение. Это yield
только уникальные расстройства, как и должно быть.
Я не прошу решения моего программного задания, я просто хочу знать причины использования goto
для динамической оценки кода или наоборот.
Редактировать: , чтобы уточнить, назначение включало в себя написание программы с использованием итераторов, а другой - с использованием рекурсии, поэтому итеративная версия не обязательно должна быть эффективной.