использование goto против оценки кода во время выполнения - PullRequest
4 голосов
/ 11 сентября 2009

Недавно для класса программирования нам было дано задание написать программу на любом языке, который при 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 для динамической оценки кода или наоборот.

Редактировать: , чтобы уточнить, назначение включало в себя написание программы с использованием итераторов, а другой - с использованием рекурсии, поэтому итеративная версия не обязательно должна быть эффективной.

Ответы [ 11 ]

0 голосов
/ 11 сентября 2009

гото не чистые. но если требуется высокая производительность, вам нужно иногда нарушать некоторые из этих правил кодирования ...

если скорость действительно важна, например, если вы хотите написать библиотеку или код, к которому у вас большой труд, вы можете рассмотреть возможность использования goto наверняка стоит обратить внимание, что все идет хорошо.

Комментарий : В конце исполняющий процессор не делает ничего, кроме простых переходов. Только то, что язык программирования / компилятор их создает. используйте с осторожностью и не связывайтесь с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...