logo
TurboProlog / Документация / TOM_1

Как задать хвостовую рекурсию

Что означает фраза "одна процедура вызывает другую, выполняя свой

самый последний шаг"? На языке Пролог это значит:

1. Вызов является самой последней подцелью предложения.

2. Ранее в предложении не было возвратных точек.

Ниже приводится удовлетворяющий обоим условиям пример:

count(N) :-

write(N), nl,

NewN = N+1,

count(NewN).

Эта процедура является хвостовой рекурсией, которая вызывает себя

без резервирования нового стека, и поэтому не истощает запас своей памя-

ти. Как показывает программа CH07EX04.PRO, если вы дадите ей целевое ут-

верждение

count(0)

то предикат count будет печатать целые числа начиная с 0 и никогда не ос-

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

чисел, но остановки не произойдет.

/* Программа CH07EX04.PRO */

Программа с хвостовой рекурсией, которая не истощает память.

predicates

count(real)

/* Вещественые типы могут быть значительно больше

целых чисел */

clauses

count(N) :-

write(N), nl,

NewN = N+1,

count(NewN).

goal

count(1).