Как стать автором
Обновить

Комментарии 27

Вы не исключили оператор цикла, а заменили его условным переходом. Собственно, все операторы цикла на уровне ассемблера и реализованы через условные переходы.

Здесь цикл именно исключен из тела программы. Это становится совсем очевидно, если для эксперимента сделать цикл бесконечным: все остальные блоки, кроме текущего не будут активными и вообще программа зависнет, т.е. в буквально "упадет" и выход из нее будет только одним - завершить исполнение среды.

В моем варианте в теле программы цикла нет от слова совсем, а вот необходимая цикличность исполнения реализуется внешней по отношению к блокам средой, т.е. средой SimInTech..

Для тех кто по-прежнему видит циклы в теле блока и особенно тому, кто ставит "минусы". Ну, ребята, нет на вас Задорнова...

Ну а если серьезно, то просмотрите хотя бы книгу Кип Р. Ирвина "Язык ассемблера для процессоров Intel". Особенно главу "Условные вычисления". Матчасть надо знать. Ну, или спросите у разработчиков среды SimInTech - есть ли внутри тела рассмотренного автоматного блока цикл? Возможно они вам и ответят... ;)

я настолько старый, что помню примеры из книжки про бейсик, условно:

10 X = 0

20 X = X + 1

30 PRINT X

40 IF X < 10 GOTO 20

Это "цикл" или "условный переход"?

Пожилых надо уважать, а потому отнеситесь с пониманием к моим последующим словам и не подумайте чего плохого...

Вы в принципе задали хороший вопрос, но из него следует также, что Вы ни чего не поняли или совсем не читали статью. Но есть такой принцип: если не получается постичь умом - попробуйте ручками...

Бейсик - это, конечно, круто :) Поэтому, чтобы не задирать планку, я все же не зря взял для демонстрации SimInTech. Его можно скачать и ручками, ручками, если не доходит по-иному, воссоздать НОД или же создать аналог Вашего или любого другого примера.

Но возьмем за основу Ваш пример. В SimInTech в аналоге вашего примера сделайте условие безусловным. В оригинале это было бы просто GOTO 20. В SimInTech это будет, конечно, несколько иначе, но ... все же освойте тамошнее программирование без GOTO (теория - у Вирта). Посмотрите, что получится. Это первое.

Второе. Подобно мне, повторив мои шаги, создайте автоматный аналог Вашего примера. Посмотрите что получится в этот раз. Сравните. О результатах было бы любопытно узнать.

Конечно. Для убеленного "годами" ветерана это может показаться достаточно сложным, но ... все же попробуйте. Уверен, что Вам покорятся вершины SimInTech, а затем, как следствие, и вершины автоматного программирования...

Собственно все сказанное выше относится и ко всем кто тут увлеченно "минусует". Настоятельно советую - ручками, ручками, ручками, если без этого не заходит.

Только без обид, плиз. Вот, как-то так и не иначе.

Конечный автомат — это цикл, на каждой итерации которого автомат меняет состояние исходя из текущего состояния и входного символа. И этот цикл выполняется, пока автомат не перейдёт в конечное состояние. На вашем Рис.5 явно видны два цикла из S1 в S1.

Конечный автомат — это цикл...

Смотрите определение КА. Там ни слова про циклы. Но есть переходы между состояниями (функция переходов автомата). Те "циклы", о которых Вы ведете речь - это обычные переходы, у которых только следующее состояние совпадает с текущим. Вот их все отличие от других переходов (которые, видимо, не циклы)...

В определении может и нет, но в реализации есть. Вот ваш автомат с Рис.9 выполнил строку 11. Каким образом он работает дальше?
А переходы S1 -> S1 — это именно циклы графа. Вы не сможете реализовать их используя только линейный код.

Он завершает текущий такт и ждет следующего дискретного такта. Как? - просто. Извне. Это реализует "автоматная машина" или, если хотите, "автоматный процессор", машина Тьюринга и т.д. и т.п. В данном случае их роль взяло на себя ядро среды SimInTech. Где здесь цикл? Но есть некая "машина" реализующая автоматные функции - переходо/выходов. Еще раз - есть некий "реализатор", т.е. внешняя среда, которая в данном случае "черный ящик".. В идеале это может быть и "автоматный процессор", аналогичный обычному процессору.

От того, что цикл реализован снаружи, он не перестаёт быть циклом.

НЛО прилетело и опубликовало эту надпись здесь

Чтобы ощутить разницу сравните две блок-схемы НОД. Одна содержит циклы, вторая - нет.

Первая не вернет управление (выполнит exit) пока не завершит циклы, вторая - по-любому "просквозит" со входа на выход. Первая при попадании в бесконечный цикл обрушит проект, вторая - ни когда. Вот эти процессы и отражает SimInTech.

Да, и еще существенный момент. Слева - это алгоритм функции, а справа это все же алгоритм процесса. Вот такие нюансы тоже нужно учитывать. Кроме того, функция рассматривается, как условно мгновенна, даже если содержит длительный по времени цикл. А вот процесс - это всегда во времени. Даже если его жизнь условно мизерна во времени (определяется числом дискретных шагов, например, одним ;).

НЛО прилетело и опубликовало эту надпись здесь

Вопрос, может, и простой, но я не очень понял о чем он ;)

И на скрине алгоритм один, но представленный двумя моделями - блок-схема и автомат.

НЛО прилетело и опубликовало эту надпись здесь

Теперь вычислите НОД одним вызовом второй блок-схемы. Не получается? Нужно вызывать повторно? Так повторный вызов до достижения результата и есть цикл.

Повторный вызов не цикл. А автомат, вычисляющий за один вызов, может быть таким. Правда при проверке входных параметров это будет два:

Вычисление за один вызов

Но все это скажется на результате:

Тестирование двухтактного алгоритма НОД

Слева - автоматы. Справа - один блок "двухтактный". Попробуйте объяснить вид графика и результаты правой схемы.

Ваш код не выполняет вычисление за один вызов. И за два не выполняет, и за три тоже. Попробуйте на бумаге оттрассировать его выполнение для x1 = 11 и x2 = 3.
Так как же вы собираетесь многократно вызывать свой автомат без цикла? В индусском стиле, записав 100500 вызовов один за другим?
А по вашей картинке могу только сказать, что у вас где-то ошибка в коде.
НОД(10, 2) = 2, а не 10.

Да уж, неудобно, но должен признать, что дал "в штангу". Можно даже сказал "промазал" :)... Конечно, все совсем не так... Даже код совсем не тот привел :(

Должно быть так:

Вычисление за один такт

Заменен один блок. Остальные два - автоматы. Видно, что он, как и должно, считает "мгновенно". Считает правильно, но динамика искажена. Я новому блоку даже увеличил число циклов расчета, но "мгновенный" он есть мгновенный.

Здесь я заменил и остальные два мгновенными. Расчет тоже мгновенный :)

Все однотактные автоматы

Но для разнообразия на примере трех блоков я показал "дрейф" от обычного кода к автоматному.

Варианты алгоритмов НОД

А вот тест для 11, 3. И здесь за один такт:

Тест 11, 3

Надеюсь, в этот раз не лажанул :) Все спешка-спешка.... Куда спешим? ;)

Да, если смотреть на код от 1 к 3, то мне будет понятна критика. Любая :) Но, во-первых, это Pascal, а не С++. Здесь да еще с ООП, все гораздо логичнее, проще и нагляднее. А, во-вторых, глядя на подобное "безобразие" я все же скажу, что я по-другому уже и не могу. А потому кто бы что ни говорил , я все равно буду примерно так как в 3 :) Но, конечно, на С++ А потом, чем сложнее алгоритм, тем получается больше выгоды.

отличная статья, тоже хотел разобраться с конечными автоматами

Спасибо за добрые слова и успехов. Если вникните - не пожалеете ;)

как же автор удивиться функциональным языкам без управляющих конструкций из мира процедурного программирования

Не удивится ;) Просто это уже другая песня (в смысле алгоритмическая модель)

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

Если бы моё знакомство с программированием началось с таких задач, я бы никогда не стал программистом. Потому что увлекательный процесс подчинения компьютера заменён на максимально скучную математику.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории