Согласно теореме Бёма-Якопини, алгоритм можно написать, используя только три утверждения:
- последовательность
- отбор
- итерация
Многие учителя принимают эту теорему как акт веры и учат не использовать (goto, jump, break, множественный возврат и т. Д.), Потому что эти инструкции злы.
Но когда я прошу объяснений, никто не может предоставить доказательства теоремы.
Лично я не считаю эту теорему ложной, но думаю, что ее применимость в реальном мире не всегда лучший выбор.
Итак, я проделал свой небольшой поиск, и вот мои сомнения:
Теорема была доказана индукцией по структуре блок-схемы, но она действительно применима в компьютерной программе?
Согласно википедии, «алгоритм Бема и Якопини не был практичным в качестве алгоритма преобразования программы, и, таким образом, открыл дверь для дополнительные исследования в этом направлении ».Следствие теоремы доказывает, что каждое «goto» можно преобразовать в выбор или итерацию по индукции, но как насчет эффективности? Я не могу найти никаких доказательств того, что каждый алгоритм можно переписать с сохранением той же производительности.
Рекурсия, рекурсивный алгоритм действительно можно написать, используя только последовательность, выбор и итерацию? Я знаю, что некоторые рекурсивные алгоритмы можно оптимизировать как циклы (подумайте о хвостовой рекурсии), но действительно ли они могут быть применимы ко всем?
Чистый код, я знаю, что злоупотребление переходами может создать чудовищный код, но я думаю, что в некоторых случаях правильное использование break в цикле может улучшить читаемость кода.
Образец:
n = 0;
while (n < 1000 || (cond1 && cond2) || (cond3 && cond4) || (cond5 && cond6))
{
n++;
//The rest of code
}
Можно переписать как:
for (n = 0; n < 1000; n++)
{
if (cond1 && cond2) break;
elseif (cond2 && cond3) break;
elseif (cond4 && cond5) break;
elseif (cond6 && cond7) break;
//The rest of code
}
Лично я считаю, что теорема не была создана для написания лучшего кода, и идея о том, что чистый код должен следовать этой теореме, распространилась в мире по странной субъективной причине.
- Я нашел эту интересную статью: https://www.cs.cornell.edu/~kozen/papers/bohmjacopini.pdf Я думаю, это доказывает, что реальную программу нельзя заставлять следовать теореме Яопини.
Вы разделяете те же выводы?
Обобщая вопрос, мне нужно знать, действительно ли программа, которая использует только (последовательность, выбор и итерацию), лучше, чем любая другая, использующая другие утверждения, и есть ли доказательства или все это субъективно.
break
илиcontinue
) имеют место, но Дейкстра в значительной степени выиграл войну. Теорема Бема-Якопини не имела к этому никакого отношения (помимо предоставления ответа тем программистам, которые утверждали, что gotos необходимы в абсолютном смысле). Успех структурного программирования - вот что убедило. - person John Coleman   schedule 01.11.2016