Bubble-sort im Prolog-Sprache
Muss ich implementieren Sie den bubble-sort-Funktion (die Sortier-Algorithmus).
Habe ich bereits umgesetzt bubblesort
und swap
eine Hilfe-Funktion für bubblesort
:
swap([X,Y|T1],[Y,X|T1]):-(Y<X,!).
swap([X|T1],[X|T2]):- swap(T1,T2).
bubblesort([],[]) :- !.
bubblesort(T1,T2) :- (bubblesort(swap(T1,T2),T2)).
Bekomme ich eine Endlosschleife. Ich muss die Signatur der Funktion:
bubblesort(T1,T2)
Ich bin stecken geblieben auf diese Frage für 2 Stunden. Hat jemand eine Idee, wie ich das tun kann?
- Ahh Prolog... Schlechte Erinnerungen 🙂
- Ahh BubbleSort... Schlechte Erinnerungen 🙂
- Ahh, BubbleSort und Prolog... gute Erinnerungen 😉
- Wenn Hausaufgaben, Kennzeichnen Sie bitte als solche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem verursacht wurde durch rekursive Abfragen. Beim Abfragen
bubblesort(T1, T2)
,es fragt
bubblesort(swap(T1, T2), T2)
, dann durch die zweite Klausel vonbubblesort/2
,bubblesort(swap(swap(T1, T2), T2'), T2)
undT2
ist einheitlich wieT2
, und dann Schleife.Es hat nie das erste Ergebnis
swap(T1, T2)
Abfrage.Bis es keine änderung im swap-Verfahren, halten, tauschen. Wenn es keine änderung in der swap-dann haben Sie sortierte Liste.
Den einfachen bubble-sort-Algorithmus ist im wesentlichen aus zwei Schleifen:
Die innere Schleife (1) ausgedrückt werden kann, wie diese:
do_bubble_sort/2
oben nimmt eine Liste und rekursiv swaps aufeinander folgende Elemente entlang der Liste, wenn Sie nicht erfüllen die=<
test (3. Klausel). Diese innere Schleife wird dann aufgerufen durch die äußere Schleife Prädikatbubble_sort/2
, wie unten gezeigt:Dieses Prädikat nimmt die input-Liste und rekursiv gilt
do_bubble_sort/2
bis das Prädikatsorted_order/1
gelingt es, auf das Ergebnis, d.h., wenn die Liste irgendwann sortiert.sorted_order/1
werden können, die wie folgt definiert sind:Dieses Prädikat nimmt eine Liste und rekursiv überprüft, dass jedes paar von aufeinander folgenden Elemente werden in sortierter Reihenfolge (durch die
=<
testen, nur da wir indo_bubble_sort/2
- dies ist wichtig, da sonst der Algorithmus vielleicht nicht beenden!)Es fast weh tut, etwas zu schreiben, so ineffizient: