20.10.2016 в 22:29
все прозрел!)) вот оно, решение!))
Получается, что здесь есть еще одна, третья операция, а именно — запись в стек.
Т.е. перед вызовом функции, например, Rec (1), вначале записывается состояние предыдущей функции Rec(2) — ее переменная а, значение этой переменной 2 и точка вызова (после которой должна будет выполняться команда whriteln)
И второй важный момент, что в стек записывается не отдельная команда, а функция целиком, состоящая из нескольких команд. Тогда вполне наглядно видно, что функция началась, но не закончилась.
Спасибо огромное! Выручили, сняли камень с души))
Занес сайт в закладки, буду заходить))
|
|
Макс
|
21.10.2016 в 20:58
|
а можно еще похожий вопрос, вот есть такой код, стартовое значение 1. Он вроде проще, но там есть одна закавыка
if a<11 then
writeln(a);
Rec(a+1);
Закавыка в том, что вызов функции не входит в тело условия if и тогда получается, что функция будет вызываться снова и снова. Но реально пример работает и выводит последовательность от 1 до 10. Почему функция больше не вызывается?
|
|
Taras
|
22.10.2016 в 01:37
|
Функция вызывается, просто больше ничего не печатает.
|
|
Taras
|
22.10.2016 в 20:32
|
Да, теоретически бесконечно. Практически, либо стек переполнится и программа аварийно завершится, либо «умный» компилятор, поняв, что программа фактически ничего не делает, уберет лишние вызовы.
|
|
Макс
|
23.10.2016 в 23:16
|
Спасибо! В принципе об этом говорилось у вас здесь в самом начале, но одно дело когда просто написано, другое — когда сам это реально видишь))
В общем, еще раз — спасибо огромное, что помогли разобраться!
|
|
М.В.
|
24.04.2018 в 08:26
|
В самом первом примере последовательность выводимых чисел будет равна 3 2 1 0.
|
Do'stlaringiz bilan baham: |