Sie sind nicht angemeldet.

ice-cream

Junior Schreiberling

  • »ice-cream« ist weiblich
  • »ice-cream« ist der Autor dieses Themas

Beiträge: 237

Registrierungsdatum: 29.10.2009

1

13.11.2009, 23:55

Scheme cdr und car(Paare)

Habe das Prinzip nicht wirklich verstanden....

(define struktur (cons (cons 1 2) (cons 5 (cons (cons 8 3) 7))))

struktur ; ((1 . 2) 5 (8 . 3) . 7)

; Zugriff auf die Zahl 3
(cdr (car (cdr (cdr struktur)))) ; 3
(cdaddr struktur) ; 3



Wie kommt man bei diesem beispiel auf die zahl 3 das mit dem kästchen hab ich versucht nachzuvolziehen aber geht nicht kanns jemand erklären wie man cons in car und cdr umschreibt?

oixio

Senior Schreiberling

  • »oixio« ist männlich

Beiträge: 517

Registrierungsdatum: 03.10.2004

2

14.11.2009, 00:11

Ich glaube du wirfst da was durcheinander. Mit cons erzeugt man so ein Kästchen. cons klebt also quasi die beiden Teile zusammen und liefert ein Pärchen zurück.

Mit car und cdr kann man aus so einem Pärchen wieder auf die einzelnen Teile zugreifen. car liefert dabei die vordere Hälfte, cdr die hintere.

Beispiel:

(cons 1 2) --> (1 . 2)

(car (cons 1 2)) --> 1

(cdr (cons 1 2)) --> 2

In der Aufgabe die die Kästchen noch verschachtelt, d.h. du musst evtl. car/cdr mehrmals hintereinander anwenden, um an das gewünschte Element zu kommen. Aufmalen hilft da weiter. Die Klammer-Punkt-Ausgabe auf der Scheme-Konsole ist nicht immer eindeutig und daher mit vorsicht zu genießen.

Hilft dir das weiter?
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

ice-cream

Junior Schreiberling

  • »ice-cream« ist weiblich
  • »ice-cream« ist der Autor dieses Themas

Beiträge: 237

Registrierungsdatum: 29.10.2009

3

14.11.2009, 00:17

Meine Frage ist eher wie man von

(define struktur (cons (cons 1 2) (cons 5 (cons (cons 8 3) 7))))

auf

(cdr (car (cdr (cdr struktur))))

kommt

um auf die 3 zuzugreifen also mit anderen worten warum wende ich cdr,car,cdr, an um zu 3 zu gelangen?

hyperion

Erfahrener Schreiberling

  • »hyperion« ist männlich

Beiträge: 422

Registrierungsdatum: 08.10.2004

4

14.11.2009, 00:25

Quellcode

1
(define struktur (cons (cons 1 2) (cons 5 (cons (cons 8 3) 7))))


ergibt ja das Folgende

Quellcode

1
((1 . 2) 5 (8 . 3) . 7)


Nun wendest Du ja

Quellcode

1
(cdr (car (cdr (cdr struktur))))


drauf an und erhältst 3.

  1. Schritt: cdr struktur => (5 (8 . 3) . 7)
  2. Schritt: cdr (5 (8 . 3) 7) => ((8 . 3) 7)
  3. Schritt: car ((8 . 3) 7) => (8 . 3)
  4. Schritt: cdr (8 . 3) => 3


Hoffe das ist so verständlich ;)
"Der Klügere gibt nach! Eine traurige Wahrheit, sie begründet die Weltherrschaft der Dummheit." --Marie von Ebner-Eschenbach

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »hyperion« (14.11.2009, 00:26)


ice-cream

Junior Schreiberling

  • »ice-cream« ist weiblich
  • »ice-cream« ist der Autor dieses Themas

Beiträge: 237

Registrierungsdatum: 29.10.2009

5

14.11.2009, 00:28

Quellcode

1
(define struktur (cons (cons 1 2) (cons 5 (cons (cons 8 3) 7))))


ergibt ja das Folgende

Quellcode

1
((1 . 2) 5 (8 . 3) . 7)


Nun wendest Du ja

Quellcode

1
(cdr (car (cdr (cdr struktur))))


drauf an und erhältst 3.

  1. Schritt: cdr struktur => (5 (8 . 3) . 7)
  2. Schritt: cdr (5 (8 . 3) 7) => ((8 . 3) 7)
  3. Schritt: car ((8 . 3) 7) => (8 . 3)
  4. Schritt: cdr (8 . 3) => 3


Hoffe das ist so verständlich ;)





nicht wirklich ;(

hyperion

Erfahrener Schreiberling

  • »hyperion« ist männlich

Beiträge: 422

Registrierungsdatum: 08.10.2004

6

14.11.2009, 00:35

Ok, Oixio hatte ja schon gesagt, dass ein cons zwei Elemente zu einem Tupel macht:

Quellcode

1
(cons 1 2) => (1 . 2)


Nun möchtest Du ja wieder auf die Elemente im Tupel zugreifen können, dafür sind car und cdr da. car ermöglicht den Zugriff auf das erste Element und cdr den Zugriff auf den Rest.

Quellcode

1
2
(car (cons 1 2)) => 1
(cdr (cons 1 2)) => 2


Das gilt genauso für kompliziertere "Tupel"

Quellcode

1
2
(car (cons 1 (cons 2 3))) => 1
(cdr (cons 1 (cons 2 3))) => (2 . 3)


Du kannst beliebig komplizierte Strukturen mit cons erzeugen, so auch den Aufruf von struktur in Deinem Beispiel.

Quellcode

1
((1 . 2) 5 (8 . 3) . 7)


Ist die Scheme Darstellung Deiner struktur. Dir ist ja sicher aufgefallen, dass in der äusseren Klammer nur ein Punkt steht, dieser steht ganz am Ende. Das ist normal so, aber trotzdem sind die Zahlen darin einzelne Elemente. Das bedeutet

Quellcode

1
2
(car struktur) => (1 . 2)
(cdr struktur) => (5 (8 . 3) . 7)


Und so weiter und sofort, danach musst Du nur noch fröhlich car und cdr auf die Struktur loslassen um ein beliebiges Element zu erreichen.
"Der Klügere gibt nach! Eine traurige Wahrheit, sie begründet die Weltherrschaft der Dummheit." --Marie von Ebner-Eschenbach

Panoramix

Trainee

Beiträge: 115

Registrierungsdatum: 12.09.2008

7

14.11.2009, 14:21

Falls es noch immer nicht klar sein sollte:

Mache Dir bei komplizierteren Ausdrücken immer klar, wo die beiden Elemente sind, die zu einem cons gehören und auf die Du dann mit car und cdr zugreifen kannst:

(cons (cons 1 2) (cons 5 (cons (cons 8 3) 7))) ; struktur
(cons (cons 1 2) (cons 5 (cons (cons 8 3) 7))) ; (cdr struktur)
(cons (cons 1 2) (cons 5 (cons (cons 8 3) 7))) ; (cdr (cdr struktur))

usw.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Panoramix« (14.11.2009, 14:23)


retr0virus

Trainee

  • »retr0virus« ist männlich

Beiträge: 83

Registrierungsdatum: 02.10.2006

Wohnort: NRW -> Bad Oeynhausen

Beruf: B.Sc. Informatik, 8.Semester

8

14.11.2009, 22:39

Vielleicht hilft es auch zu erwähnen, dass man car und cdr "von innen" liest.
D.h. bei (car (cdr struktur)) wird zuerst cdr auf struktur angewendet und dann wird auf das Ergebnis (also auf den zweiten Teil der Struktur) car angewendet NICHT erst car und dann cdr.
Im Prinzip werden also nur die Klammern aufgelöst - und das geht nur von innen nach außen.
Ein Nichts im Nichts und ins Nichts vertrieben!
- Ren Dhark