Россия, Пошатово |
Как обойтись без рекурсии
8.3. Более сложные случаи рекурсии
Пусть функция с натуральными аргументами и значениями
определена рекурсивно условиями











Если дополнительно известно, что для
всех
,
то вычисление
не представляет труда: вычисляем
последовательно
8.3.1.
Написать нерекурсивную программу вычисления для общего
случая.
Решение. Для вычисления вычисляем
последовательность


Еще более сложный случай из следующей задачи вряд ли
встретится на практике (а если и встретится, то проще
рекурсию не устранять, а оставить). Но тем не менее: пусть
функция с натуральными аргументами и значениями
определяется соотношениями








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





Перейдем теперь к нашей задаче. В процессе вычисления
значения функции мы будем работать со стеком чисел,
а также с последовательностью чисел и символов f, l, r, h, которую мы будем интерпретировать как
последовательность нажатий клавиш на стековом калькуляторе.
Инвариант такой:



![{\hss
\begin{array}{llll}
{старый} & {старая}& {новый} & {новая}
\\[-.5ex]
{стек} & {последовательность}&{стек} &{последовательность}
\\[1ex]
%
X\ & x\ P & X\ x & P\\
X\ x & {l}\ P & X\ l(x) & P\\
X\ x & {r}\ P & X\ r(x) & P \\
X\ x\ y\ z& {h}\ P & X\ h(x,y,z) & P \\
X\ 0 & {f}\ P & X\ a & P \\
X\ x & {f}\ P & X & x\ x\ {l}\ {f}\ x\ {r}\ {f}\
{h}\ P
\end{array}\hss}](/sites/default/files/tex_cache/8b78a14a434ae2d0a458130958a60735.png)







Замечание. Последовательность по существу представляет собой стек отложенных заданий (вершина которого находится слева).