Расчет чисел Аккермана
Есть более крепкий орешек – числа Аккермана, зависящие уже от двух переменных (см. рис. 6.13 с двойной рекурсией). В среде Mathcad числа Аккермана можно рассчитать только для значений аргументов m и n, находящихся недалеко от нулей («каботажное плавание»). Расчет, например, значения Akk(4, 6) через некоторое время аварийно прерывается – см. рис. 6.13. Рекурсия – это когда программист, сокращая текст программы, перекладывает свои проблемы на плечи машины, которой приходится генерировать длинный ряд новых локальных переменных. Отсюда и сбои. Выход из положения – замена рекурсии на рекуррентность (цикл), что автор и предлагает сделать читателям по отношению к числам Аккермана.
Для закрепления темы рекурсии приводим текст BASIC-программы, решающей известную головоломку «Ханойские башни»[28]
(рис. 6.14):
DefInt N
DefStr X-Z
Declare Sub PUTDISK (N%, X$, Y$, Z$)
Input "Число дисков в пирамиде"; N0
PUTDISK N0, "A", "B", "C"
End
Sub PUTDISK (N%, X$, Y$, Z$)
DefInt N
DefStr X-Z
If N = 1 Then
Print X; "-"; Z
Else
PUTDISK N - 1, X, Z, Y
Print X; "-"; Z
PUTDISK N - 1, Y, X, Z
End If
End Sub