108 Глава 5. Управляющие структуры
ким относится, например, задача о вычислении чисел Аккермана, которые
определяются для целых неотрицательных m и n следующим образом:
A(m,n) =
n+ 1, когда m = 0,
A(m−1,1), когда n = 0,
A(m−1,A(m,n−1)).
Подводя итог, можно сказать, что процедурной рекурсией в среде Смолток
пользоваться можно, только надо иметь в виду присущие ей ограничения.
Но, говоря о рекурсии в смолтоковской среде, надо сказать, что здесь ре-
курсия — это один из основных принципов организации вычислений, ос-
нованный на рекурсивности многих структур данных в системе (например,
иерархии классов). Когда мы сказали, что рекурсивный метод «вызывает
сам себя», мы не стали уточнять, что это значит. Кроме привычного про-
цедурного смысла, здесь возможен и другой, когда сообщение, посланное
объекту, представляющему собой рекурсивную структуру данных, переад-
ресовывается им своим структурным единицам.
Из-за присущего объектно-ориентированным системам полиморфизма
в них могут возникать (и возникают) сложные цепочки рекурсивных вы-
зовов. Такой механизм вычислений называют объектно-ориентированной
рекурсией. При этих вычислениях объект, получив сообщение, обрабаты-
вает часть запроса (в рамках своей компетенции) и передает запрос дру-
гим объектам, которые сами вправе поступить точно так же или выполнить
оставшуюся работу самостоятельно. Таким образом, вся обработка сообще-
ния распределяется между множеством обработчиков.
В процедурной рекурсии функция каждый раз вызывается с разными,
но однотипными аргументами. В конечном счете, аргумент принимает ос-
новное значение (условие выхода из рекурсии), при котором функция вы-
числяется очень просто, а затем рекурсия развертывается в обратном на-
правлении до первоначального обращения. В объектно-ориентированной
рекурсии метод полиморфно посылает сообщение другому получателю, ко-
торый может быть другим экземпляром того же или другого класса. В ко-
нечном счете, вызывается метод, реализующий основной случай, который
достаточно просто выполняет поставленную задачу, а затем рекурсия раз-
вертывается в обратном направлении до первого посланного сообщения.
Как правило, объектно-ориентированная рекурсия реализуется вдоль ре-
курсивной древовидной структуры и может использовать передачу сообще-
ний по дереву как вверх, так и вниз. При этом уровень сложности таких
структур заранее не известен. Ни один узел структуры не знает, что собой
представляют другие ее узлы. Но зато каждый узел знает, каковы преды-
дущие и последующие узлы, так что, в конечном счете, все узлы можно
перечислить один за другим.