Если язык
очень чисто функциональный, то списка посещений нет. Вместо него используется функция, возвращающая побывали ли мы на этом поле. А во время рекурсии эта функция "поправляется" (на весьма условно языке-гибриде):
Код:
travest = lambda(current, length, checkvisited, printtrace) (
newcheck = lambda(pos) (
(pos == current) OR checkvisited(pos)
)
newprint = lambda() (
print(current)
printtrace()
)
if (validpos(current) AND NOT checkvisited(current),
if(length >= 64, complete_execution(newprint))
travest(move1(current), length + 1, newcheck, newprint)
travest(move2(current), length + 1, newcheck, newprint)
travest(move3(current), length + 1, newcheck, newprint)
...
)
)
validpos() проверяет, что мы не вышли за пределы доски,
move1() и ей подобные делает ход, не глядя, попадаем ли мы на доску или нет. Идея все та же -- перебор с возвратом. Но функциональная тонкость -- то, что
newcheck() на каждом этапе рекурсии своя (хотя и называется также). Она определяется каждый раз в новом
контексте, с новыми
current и
checkvisited(). Тоже относится и к
printtrace().