Листинг 5.9. Бесконечная рекурсия (хвостовая рекурсия)

predicates

count(real)

clauses

count(N):-

write(N),nl,

NewN=N+1,

count(NewN).

Эта процедура count(N) –является хвостовой рекурсией, которая вызывает себя без резервирования нового стекового фрейма, и потому не истощает запас памяти, в конечном итоге произойдет целочисленное переполнение, но остановки из-за нехватки памяти не будет.

Введение условия, ограничивающего бесконечную рекурсию:

Листинг 5.10.Ограничение бесконечной рекурсии

predicates

count(integer)

check(integerl)

clauses

count(N):-

write(N),nl,

NewN=N+1,

сheck(NewN),

count(NewN).

check(Z):-Z<5.

goal

clearwindow,

write(“result:”),nl,

count(1).

Замечание:

В Прологе мы не можем изменить значение переменной, поэтому создаем новую переменную NewN.

Добавим еще одно предложение после рекурсивного вызова


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: