You are not logged in.

ice-cream

Junior Schreiberling

  • "ice-cream" is female
  • "ice-cream" started this thread

Posts: 237

Date of registration: Oct 29th 2009

1

Friday, November 13th 2009, 11:55pm

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" is male

Posts: 517

Date of registration: Oct 3rd 2004

2

Saturday, November 14th 2009, 12:11am

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" is female
  • "ice-cream" started this thread

Posts: 237

Date of registration: Oct 29th 2009

3

Saturday, November 14th 2009, 12:17am

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" is male

Posts: 422

Date of registration: Oct 8th 2004

4

Saturday, November 14th 2009, 12:25am

Source code

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


ergibt ja das Folgende

Source code

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


Nun wendest Du ja

Source code

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

This post has been edited 1 times, last edit by "hyperion" (Nov 14th 2009, 12:26am)


ice-cream

Junior Schreiberling

  • "ice-cream" is female
  • "ice-cream" started this thread

Posts: 237

Date of registration: Oct 29th 2009

5

Saturday, November 14th 2009, 12:28am

Source code

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


ergibt ja das Folgende

Source code

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


Nun wendest Du ja

Source code

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" is male

Posts: 422

Date of registration: Oct 8th 2004

6

Saturday, November 14th 2009, 12:35am

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

Source code

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.

Source code

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


Das gilt genauso für kompliziertere "Tupel"

Source code

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.

Source code

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

Source code

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

Posts: 115

Date of registration: Sep 12th 2008

7

Saturday, November 14th 2009, 2:21pm

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.

This post has been edited 2 times, last edit by "Panoramix" (Nov 14th 2009, 2:23pm)


retr0virus

Trainee

  • "retr0virus" is male

Posts: 83

Date of registration: Oct 2nd 2006

Location: NRW -> Bad Oeynhausen

Occupation: B.Sc. Informatik, 8.Semester

8

Saturday, November 14th 2009, 10:39pm

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