Похоже, что все голосуют за реверс / 2 решение.Полагаю, вы, ребята, имеете в виду решение с обратным / 2, которое равно O (n) из данного списка.Что-то с аккумулятором:
reverse(X,Y) :- reverse(X,[],Y).
reverse([],X,X).
reverse([X|Y],Z,T) :- reverse(Y,[X|Z],T).
Но есть и другие способы проверки на палиндром.Я придумал решение, которое использует DCG.Можно использовать следующие правила:
palin --> [].
palin --> [_].
palin --> [Border], palin, [Border].
Какое решение лучше?Что ж, давайте сделаем небольшую статистику с помощью команды профиля системы Prolog.Вот результаты:
Так что, возможно, решение DCG часто быстрее в положительном случае («радар»), ему не нужно строить весь обратный список, нонепосредственно перемещается в середину, а затем проверяет остальное во время выхода из своей собственной рекурсии.Но недостатком решения DCG является то, что оно недетерминировано.Некоторые измерения времени покажут больше ...
Пока
PS: статистика портов выполняется с помощью нового подключаемого отладчика Jekejeke Prolog:
http://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_dev/10_docu/02_reference/04_examples/02_count.html
Но другой прологсистемы имеют аналогичные средства.Для получения дополнительной информации см. Столбец «Code Profiler»:
http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations