FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Praktische Informatik

Liste umdrehen

Liste umdrehen 2003-03-31 13:24
Anonymer User
Hi, habe immer noch Probleme zu unterscheiden, wann ein | etwas hinzufügen und wann etwas abschneiden soll. Z.B. bei dem Versuch eine Liste umzudrehen: myreverse([],_). %Rekursionsabschluss myreverse([Kopf|Liste1],Liste2):-myreverse(Liste1,[Kopf|Liste2]). %Sollte eigentlich das 1. Element der 1. Liste vorn an die 2. Liste dranhängen?!? %Beim Test jedoch: myreverse([a,b,c,d],X). X = _G1318 ; Kann mir da bitte jemand weiterhelfen???

Re: Liste umdrehen 2003-03-31 13:43
MoKrates
Ich finde, ein trace spricht Baende:
?- trace. Yes [trace] ?- myreverse([a,b,c,d], X). T Call: (6) myreverse([a, b, c, d], _G290) Call: (6) myreverse([a, b, c, d], _G290) ? creep T Call: (7) myreverse([b, c, d], [a|_G290]) Call: (7) myreverse([b, c, d], [a|_G290]) ? creep T Call: (8) myreverse([c, d], [b, a|_G290]) Call: (8) myreverse([c, d], [b, a|_G290]) ? creep T Call: (9) myreverse([d], [c, b, a|_G290]) Call: (9) myreverse([d], [c, b, a|_G290]) ? creep T Call: (10) myreverse([], [d, c, b, a|_G290]) Call: (10) myreverse([], [d, c, b, a|_G290]) ? creep T Exit: (10) myreverse([], [d, c, b, a|_G290]) Exit: (10) myreverse([], [d, c, b, a|_G290]) ? creep T Exit: (9) myreverse([d], [c, b, a|_G290]) Exit: (9) myreverse([d], [c, b, a|_G290]) ? creep T Exit: (8) myreverse([c, d], [b, a|_G290]) Exit: (8) myreverse([c, d], [b, a|_G290]) ? creep T Exit: (7) myreverse([b, c, d], [a|_G290]) Exit: (7) myreverse([b, c, d], [a|_G290]) ? creep T Exit: (6) myreverse([a, b, c, d], _G290) Exit: (6) myreverse([a, b, c, d], _G290) ? creep X = _G290 Yes
Ich schau grad noch. Aber AFAIR solltest Du nen Akku einbauen.

MoKrates

Re: Liste umdrehen 2003-03-31 13:50
Anonymer User
[trace] ?- myreverse([a,b,c,d],X). Call: (53) myreverse([a, b, c, d], _G2308) ? creep Call: (54) myreverse([b, c, d], [a|_G2308]) ? creep Call: (55) myreverse([c, d], [b, a|_G2308]) ? creep Call: (56) myreverse([d], [c, b, a|_G2308]) ? creep Call: (57) myreverse([], [d, c, b, a|_G2308]) ? creep Exit: (57) myreverse([], [d, c, b, a|_G2308]) ? creep Exit: (56) myreverse([d], [c, b, a|_G2308]) ? creep Exit: (55) myreverse([c, d], [b, a|_G2308]) ? creep Exit: (54) myreverse([b, c, d], [a|_G2308]) ? creep Exit: (53) myreverse([a, b, c, d], _G2308) ? creep Was sagt uns das nun???

Re: Liste umdrehen 2003-03-31 13:52
MoKrates
So gehts:
myreverse([], X, X). myreverse([K|L1], L2, X) :- myreverse(L1, [K|L2], X). myreverse(X,Y) :- myreverse(X, [], Y).
Du hast einen nicht-endrekursiven Ansatz versucht, der Aufgrund der Listenstruktur so nicht moeglich ist. Der obige Ansatz ist endrekursiv (Strukturmerkmal: der Akku).

MoKrates

Re: Liste umdrehen 2003-03-31 13:54
MoKrates
Was sagt uns das nun???
[_] Du hast Deinen Kopf benutzt.
[_] Du hast gesehen, dass ich noch "grade geschaut" habe.
[_] Du hast 5 min Geduld.

MoKrates

Re: Liste umdrehen 2003-03-31 13:58
Anonymer User
Das war bezogen auf den Trace. Hat sich die Liste beim "Exit" wieder aufgebaut oder ist die Darstellung immer so? P.S.: Vielen Dank - werds gleich mal ausprobieren

Re: Liste umdrehen 2003-03-31 14:08
MoKrates
Nein, die Liste baut sich nicht wieder auf. Was Du bei den "Exit" Zeilen siehst, ist der Backtracking Effekt. Wenn Du das nicht verstehst, solltest Du Dich noch sehr genau mit Rekursion & Backtracking beschaeftigen.
Das ist mir ein wenig zu ausschweifend, um es Dir hier alles zu erlaeutern.

MoKrates