Code für Prolog-Programm um zu überprüfen, ob eine gegebene Liste ist Palindrom oder nicht, ohne die Verwendung eines reverse-Betrieb
Dies ist, wie man Palindrom mit einem reverse-Betrieb.
Prädikate
palin(list)
findrev(list,list,list)
compare(list,list)
Klauseln
palin(List1):-
findrev(List1,[],List2),
compare(List1,List2).
findrev([],List1,List1).
findrev([X|Tail],List1,List2):-
findrev(Tail,[X|List1],List2).
compare([],[]):-
write("\nList is Palindrome").
compare([X|List1],[X|List2]):-
compare(List1,List2).
compare([X|List1],[Y|List2]):-
write("\nList is not Palindrome").
Aber ich möchte es ohne reverse-Betrieb. Kann jemand mir bitte helfen.
- Ich gebe nicht die eine Lösung, aber Bedenken Sie palin(Liste):- findrev(Liste,[],Liste). Für Ihre Frage, können Sie mit append([H|Tail], [H], Pal), und verwenden Sie recursivity am Schwanz.
- Warum wollen Sie es tun, ohne zu Reversieren? Das, was Konzept Sie sind gehen zu nehmen, nicht im code, aber zumindest in Worten?
InformationsquelleAutor Samitha Chathuranga | 2014-12-15
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht
Meiner Meinung nach der eleganteste Weg ist die Verwendung einer DCG-wie gezeigt -hier:
Meisten Allgemeinen Abfrage:
Konkretes Beispiel:
Match nur den ersten und letzten Elemente.
Hier ist eine option:
Obwohl es wirklich nur Rollen aus einer eigenen Implementierung von
reverse/2
.Weitere option, mit
append/3
:Eine Dritte option, die Vermeidung
append/3
komplett:Viele dieser Antworten verwenden letzten oder Anhängen, die teure Operationen.
Können Sie nicht die Hälfte der Rückseite und überprüfen Sie dann die Gleichheit.
Die Frage vereinbart, nicht zu verwenden, reverse, aber das verwendet nur einen reverse wie Prozess -, nicht eine volle Rückseite.
Eine Sache, die möglicherweise fehlen aus den oben schneidet. Obwohl nicht notwendig, verwendet werden soll für die gute Praxis:
Typische Spuren für ein Palindrom:
Und ein nicht-Palindrom: