Seite 1 von 7

HA3 7

Verfasst: 8. Nov 2007 16:30
von s!mon
Hi,

bräuchte mal einen Denkanstoß: Bei welcher Funktion von 7.1 kann ich map benutzen? Habe jetzt erstmal, generate-all-pos implementiert. Das ohne Map, weil ich ja erst eine Liste erstelle. Map bearbeitet doch einfach jedes Element einer Liste oder nicht? Daher wüsste ich auch nicht wie mir das bei insert-at helfen sollte..

Verfasst: 8. Nov 2007 16:45
von Stumpf.Alex
Map kannst du erst in insert-everywhere benutzen. Du kannst das aber auch ohne (und es ist wesentlich einfacher) map erstmal implementieren. Denn map erfordert igendwie eine super-abstrakte Idee für de Umsetzung. Ich arbeite noch daran.

Verfasst: 8. Nov 2007 19:09
von s!mon
Ok danke, habe jetzt insert-everywhere mit map implementiert. Hänge jetzt an der letzten Aufgabe. Die anderen Prozeduren funktionieren einwandfrei. Alle Examples liefern mir das Gesuchte zurück.

Dürfen in der Liste gleiche Elemente enthalten sein? Mein Problem ist jetzt, dass ich in perm immer map ausführe und dann beispielsweise so etwas erhalte:

(perm '(1 2)) -> (list (list (list 1 1 2) (list 1 1 2) (list 1 2 1)) (list (list 2 1 2) (list 1 2 2) (list 1 2 2)))

Das Problem ist also, dass er sich das erste Element nimmt und es neu in die Liste 1 2 einordnet. Er nimmt sich also die 1 und ordnet sie in 1 2 an, wodurch 1 1 2, 1 1 2 und 1 2 1 entstehen.

Wie löse ich das am Besten? Mir sind nur folgende eingefallen:
(insert-everywhere element alox)

1. Ich muss alox zunächst bearbeiten und element entfernen (mit filter?). Nachteil: falls das element doppelt enthalten ist, wird es auch 2x rausgeschmissen. Also wenn ich eine Liste 1 2 1 habe, wird er nach dem filtern versuchen, die 1 in die liste 2 einzuordnen, liefert mir also nur '(1 2) und '(2 1)

2. Da wollte ich irgendwas mit dem Element machen, glaub ich. Die Idee ist mir grad entfallen :). Werde sie nachreichen..

Verfasst: 8. Nov 2007 21:43
von giftnudel
In der Aufgabe werden Mengen erwähnt, diese zeichnen sich vor allem dadurch aus, dass sie jedes Element nur einmal enthalten: Also {1,1,2} = {1,2}.

Verfasst: 8. Nov 2007 22:50
von s!mon
Was ja heißt ich könnte es mit filter lösen oder? Habs nämlich grad mal kurz probiert und irgendwie nicht hinbekommen :) werde am samstag weiterschauen..

Verfasst: 9. Nov 2007 02:38
von Schalli
Das Problem von s!mon hatte ich auch, habs aber mit filter lösen können ;)

Jetzt steh ich nur vor dem Problem das ich am Ende (auch nach flatten-once) einige listen doppelt in der liste stehn hab, warum auch immer-.-

Bsp:

(perm '(1 2))
--> (list (list 1 2) (list 2 1) (list 2 1) (list 1 2))

Jemand ne Idee woran das liegen kann?

Verfasst: 9. Nov 2007 19:51
von s!mon
Führst du vielleicht insert einmal zu oft aus?

Verfasst: 10. Nov 2007 14:35
von Krümelmonster
Ich steh grad bei der insert-everywhere
Methode ganz schön auf dem Schlauch.

Code: Alles auswählen

(insert-everywhere 4 '(1 2 3))
;; should be
'((4 1 2 3) (1 4 2 3) (1 2 4 3) (1 2 3 4))
Das ergibt folgende Ausgabe:

Code: Alles auswählen

(list (list 4 1 2 3) (list (list 4 2 3) (list (list 4 3) (list 4))))
(list (list 4 1 2 3) (list 1 4 2 3) (list 1 2 4 3) (list 1 2 3 4))
Ich müsste also den Anfang der Liste bis zu
der Stelle an der ich das Element rein setze
einfügen.

Ich habe mir gedacht, dass mir die generate-all-pos
Methode dabei helfen könnte, aber die kann ja nur mit
Zahlen umgehen, insert-everywhere soll aber eine
abstrakte Funktion sein, die mit allen Listen umgehen
können soll.

Ich habe auch noch kein map benutzt, da ich nicht weiß
welche Funktion ich übergeben soll.
Habe mir nur eine lokale Hilfsprozedur in insert-everywhere
geschrieben.

Kann mir evtl. jemand, der es schon hinbekommen hat,
einen kleinen Denkanstoß geben?
Ich habe das Gefühl, ich habe einen ganz falschen
Ansatz.

Verfasst: 10. Nov 2007 14:46
von Stumpf.Alex
Genau das Problem habe ich auch irgendwie. Hab da zwar was mit map hinbekommen, aber meiner Meinung ist das auch nicht sauber. (Das einzige was bei mir mpa macht, ist die Liste als Unterlisten einzufügen.) Hab genau das gleiche Denkproblem, dass ich einfach keinen Ansatz finde, das Problem zu Umgehen, dass man mit map nicht weiß wo man sich in der Liste befindet oder man einfach nicht die Liste erhalten kann, die man bereits abgearbeitet ab.
Hoffe jemand kann uns da mal einen Denkanstoß geben. Also möglich muss es sein!

Verfasst: 10. Nov 2007 19:04
von raistlin
@schalli hatte das selbe problem auch, habs jetzt gelöst.
wenn du den selben fehler gemacht hast wie ich dann les die aufgabe nochmal durch. Dein perm algorithmus is vermutlich falsch.
Einfach überall insert everywhere machen und zusammenschmeisen funktioniert nicht ^^

Verfasst: 10. Nov 2007 20:36
von Nephilim
würde man in diesem Post eine Antwort darauf bekommen, ob es tragisch ist, wenn man 'insert-everywhere' zwar mit 'insert-at' gelöst hat, aber 'generate-all-pos' nicht zur Erstellung der Funktion verwendet hat? :) passt ja irgendwie zu den anderen Fragen hier...

Verfasst: 10. Nov 2007 23:41
von Stumpf.Alex
generate-all gibt irgendwie keinen Sinn in eine Funktion einzubauen, die mit allen möglichen Listen klar kommen soll. :lol:

Verfasst: 11. Nov 2007 00:26
von heiko_s
Stumpf.Alex hat geschrieben:generate-all gibt irgendwie keinen Sinn in eine Funktion einzubauen, die mit allen möglichen Listen klar kommen soll. :lol:
Beim Implementieren von insert-everywhere musst du doch insert-at mitteilen, an welche Stelle es X einfügen soll. Es geht (imo) zwar genausogut ohne, aber man soll die Prozedur halt verwenden.

Verfasst: 11. Nov 2007 01:31
von Krümelmonster
Ich habe deshalb mal meinem
Tutor ne eMail geschrieben.

//edit
Antwort vom Tutor:
Hallo,
das ist richtig so. Überleg dir mal folgendes:

(generate-all-pos n m) gibt eine Liste der Zahlen n bis m zurück.

(insert-at k x lst) fügt x an der k-ten Stelle ein.

Nun soll die Hauptprozedur x aber nicht nur an der k-ten Stelle einfügen,
sondern an allen möglichen Stellen der Liste. Könnte dafür eine Liste mit
Zahlen n bis m nicht irgendwo hilfreich sein?

Verfasst: 11. Nov 2007 13:42
von ChRiZz88
Mein Problem ist, dass ich bisher einfach keine Ahnung habe, welche Funktion ich über die Liste drüber laufen lassen soll.
Ich kann ja bei Scheme nicht mehrere Funktionen nacheinander ausführen, was mich immer wieder erneut Schwierigkeiten bereitet.
Irgendwie fehlt mir komplett der Ansatz bei insert-everywhere...