Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

waldinator

Praktikant

  • "waldinator" started this thread

Posts: 11

Date of registration: Nov 24th 2009

1

Wednesday, December 2nd 2009, 7:39pm

Scheme - Aufgabenblatt 7 - Aufgabe 1

Hallo,

kann mir jemand beim Aufgabenteil a helfen?
In der Übungsstunde hatten wir nur die Prozedur:
(define (square x)(* x x))

(define (deep-square l)
(cond ((null? l)'())
((pair? (car l)) (cons (deep-square (car l))(deep-square (cdr l))))
(else (cons (square (car l)) (deep-square (cdr l))))))

doch die bringt mir herzlich wenig, da sie ja nicht entschachtelt. Bin schon ewig am rumprobieren... ohne dem square kommt die Liste raus wie vorher. aber trotzdem so verschachtelt :/
kann mir jemand sagen warum? bzw. wie ich sie entschachtle? ...diese rekursion geht mir auf den senkel X(

danke schonmal

  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

2

Wednesday, December 2nd 2009, 7:45pm

Tip1: Verwende das Code-Markup und Einrückung:

Source code

1
2
3
4
5
6
(define (square x)(* x x))

(define (deep-square l)
  (cond ((null? l)'())
        ((pair? (car l)) (cons (deep-square (car l))(deep-square (cdr l))))
        (else (cons (square (car l)) (deep-square (cdr l))))))


Tip2: Was ist denn die Aufgabe? Bzw. wo ist der Link zum Aufgabenblatt? Dann können dir vielleicht auch Leute helfen, die gerade nicht Scheme hören. ;)

CS2001

Praktikant

Posts: 27

Date of registration: Oct 1st 2009

3

Wednesday, December 2nd 2009, 8:16pm

Kleiner Tipp: Verwende anstelle des cons mal ein append. (Das cons beim else sollte aber stehen bleiben :))

Panoramix

Trainee

Posts: 115

Date of registration: Sep 12th 2008

4

Wednesday, December 2nd 2009, 8:25pm

Hallo,


Tip2: Was ist denn die Aufgabe? Bzw. wo ist der Link zum Aufgabenblatt? Dann können dir vielleicht auch Leute helfen, die gerade nicht Scheme hören. ;)

Ich rate mal ... ;) Es soll wohl in einer verschachtelten Liste oder einem ähnlichen Konstrukt jedes Element quadriert werden:

Source code

1
2
(deep-square '(2 3 (4 . 5)))
(4 9 (16 . 25))


Kleiner Tipp: Verwende anstelle des cons mal ein append.

Ist gar nicht nötig, es geht viel einfacher ... ;)

waldinator, Du hast schon richtig erkannt, daß Du drei Fälle unterscheiden mußt. Vielleicht solltest Du diese drei Fälle mal in Worte fassen, vielleicht wird dann klarer, was bei den Fällen jeweils zu tun ist. Tip: Fall 1 ist richtig ... ;)

Viele Grüße
Carsten

Edit: man sollte die Punkte auch richtig setzen ... ;-)

This post has been edited 2 times, last edit by "Panoramix" (Dec 2nd 2009, 8:28pm)


Bastian

Dies, das, einfach so verschiedene Dinge

Posts: 988

Date of registration: Sep 30th 2007

5

Wednesday, December 2nd 2009, 8:40pm


Tip2: Was ist denn die Aufgabe? Bzw. wo ist der Link zum Aufgabenblatt? Dann können dir vielleicht auch Leute helfen, die gerade nicht Scheme hören. ;)

Ich rate mal ... ;) Es soll wohl in einer verschachtelten Liste oder einem ähnlichen Konstrukt jedes Element quadriert werden:

Wenn ich waldinator richtig verstanden habe, dann war das Beispiel mit dem Quadrieren aus der Übung und ihm ging es davon ausgehend um Aufgabe 1 a) auf diesem Übungsblatt.

Kleiner Tipp: Verwende anstelle des cons mal ein append.

Sehe ich auch so. Neben einer weiteren kleinen Änderung und dem Anpassen des Namens der Prozedur ;)

Edit: Auf die kleine Änderung, nämlich das square im else-Teil zu entfernen, hatte waldinator ja selbst schon am Anfang hingewiesen ...

This post has been edited 1 times, last edit by "Bastian" (Dec 2nd 2009, 9:15pm)


Panoramix

Trainee

Posts: 115

Date of registration: Sep 12th 2008

6

Wednesday, December 2nd 2009, 8:48pm

Wenn ich waldinator richtig verstanden habe, dann war das Beispiel mit dem Quadrieren aus der Übung

Ups, sorry. Da der Code in meinem ersten Test einen Fehler verursachte, bin ich davon ausgegangen, daß er bei dem Code Hilfe braucht ...

mar1k

Trainee

Posts: 41

Date of registration: Oct 17th 2009

7

Wednesday, December 2nd 2009, 9:01pm

In der Vorlesung wurde eine Prozedur die genau das tut (also das entschachteln einer verschachtelten Liste) bereits mal gezeigt (bzw eine mögliche Implementierung), bloß wurde sie für einen (zumindest scheinbar) anderen Zweck benutzt...schau mal bei
Kapitel 2 (Teil 1) nach. Der Name der Prozedur ist aber gaaanz anders ;)

waldinator

Praktikant

  • "waldinator" started this thread

Posts: 11

Date of registration: Nov 24th 2009

8

Wednesday, December 2nd 2009, 9:57pm

Danke für die vielen Antworten :)
Genau wie Bastian es meinte, es geht um Aufgabe 1 a) auf diesem Übungsblatt.
Danke für den Tipp mar1k: Kapitel 2. Hat mir schon bei aufgabe 2 geholfen mit dem append...

aber zu 1 hab ich nur das hier gefunden, was passen könnte:

[codefile](define (scale-tree tree factor)
(cond ((null? tree) '())
((not (pair? tree)) (* tree factor))
(else (cons (scale-tree (car tree) factor)
(scale-tree (cdr tree) factor)))))
[/codefile]

ich glaub damit könnte man das lösen, allerdings bin ich verwirrt von "null?" und "not pair?". Ich dachte immer null und pair wären genau das Gegenteilig. Müssten die 2 Bedingungen da nicht den selben Wahrheitswert liefern?

Bastian

Dies, das, einfach so verschiedene Dinge

Posts: 988

Date of registration: Sep 30th 2007

9

Wednesday, December 2nd 2009, 10:07pm

Ich dachte immer null und pair wären genau das Gegenteilig. Müssten die 2 Bedingungen da nicht den selben Wahrheitswert liefern?

Probier' es doch einmal selbst aus:

Source code

1
2
3
4
(null? 1)
#f
(pair? 1)
#f


Siehe auch http://docs.plt-scheme.org/reference/pairs.html

Quoted

(pair? v)
Returns #t if v is a pair, #f otherwise.

(null? v)
Returns #t if v is the empty list, #f otherwise.

mar1k

Trainee

Posts: 41

Date of registration: Oct 17th 2009

10

Wednesday, December 2nd 2009, 10:48pm

aber zu 1 hab ich nur das hier gefunden, was passen könnte:

[codefile](define (scale-tree tree factor)
(cond ((null? tree) '())
((not (pair? tree)) (* tree factor))
(else (cons (scale-tree (car tree) factor)
(scale-tree (cdr tree) factor)))))
[/codefile]

ich glaub damit könnte man das lösen, allerdings bin ich verwirrt von "null?" und "not pair?". Ich dachte immer null und pair wären genau das Gegenteilig. Müssten die 2 Bedingungen da nicht den selben Wahrheitswert liefern?

Dies ist in der Tat eine Prozedur, die dir bei Aufgabe 1 helfen kann, jedoch nicht bei a) sondern bei b) nach leichtem Modifizieren...wie du siehst multipliziert die Prozedur die gesamte Liste mit einem Faktor ohne die Struktur zu verändern...musst jetzt die Prozedur so verändern dass nicht nur Multiplizieren sondern auch andere Prozeduren möglich sind (wie in der Beispielausgabe mit sqrt).

Für a) brauchst du immer noch eine andere Prozedur ;). Bedenke, dass du cons nur brauchst um einen car und cdr Teil zusammenzusetzen, hier als Ergebnis aber eine Liste ohne jegliche Verschachtelungen und Trennungen herauskommen soll....So etwas kann erreicht werden, wenn du irgendwie an jedes einzelne Element der Liste rankommst (dass es rekursiv gehen soll hast du ja schon erkannt) und diese aneinander anfügst. Bedenke zusätzlich, dass Listen über "list" erstellt und über "append" zusammengefügt werden...ich hoffe das war genug :whistling: .

This post has been edited 2 times, last edit by "mar1k" (Dec 2nd 2009, 11:17pm)


  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

11

Wednesday, December 2nd 2009, 10:56pm

In der Vorlesung wurde eine Prozedur die genau das tut (also das entschachteln einer verschachtelten Liste) bereits mal gezeigt (bzw eine mögliche Implementierung), bloß wurde sie für einen (zumindest scheinbar) anderen Zweck benutzt...schau mal bei Kapitel 2 (Teil 1) nach. Der Name der Prozedur ist aber gaaanz anders ;)

Das Vorgehen halte ich irgendwie für wenig sinnvoll. Es geht doch darum, zu verstehen, die Aufgabenstellung zu verstehen und selbständig zu lösen. In der Prüfung sagt einem schließlich auch niemand "guck mal hier, da steht die Lösung schon"...

mar1k

Trainee

Posts: 41

Date of registration: Oct 17th 2009

12

Wednesday, December 2nd 2009, 11:06pm

In der Vorlesung wurde eine Prozedur die genau das tut (also das entschachteln einer verschachtelten Liste) bereits mal gezeigt (bzw eine mögliche Implementierung), bloß wurde sie für einen (zumindest scheinbar) anderen Zweck benutzt...schau mal bei Kapitel 2 (Teil 1) nach. Der Name der Prozedur ist aber gaaanz anders ;)

Das Vorgehen halte ich irgendwie für wenig sinnvoll. Es geht doch darum, zu verstehen, die Aufgabenstellung zu verstehen und selbständig zu lösen. In der Prüfung sagt einem schließlich auch niemand "guck mal hier, da steht die Lösung schon"...
Deswegen habe ich auch nicht gesagt dass die Lösung in Zeile 2496 steht (z.B.), sondern auf ein ganzes Kapitel des Vorlesungsskripts hingewiesen. Das gibt ihm (wie ich finde) eine Gelegenheit, sich nochmal durch die Vorlesung durchzuarbeiten, und somit nicht nur durch Zufall auf eine richtige Prozedur zu kommen sondern auch zu sehen in welchem Telgebiet des Stoffs sich die Lösung befindet.

Es ist ja nicht so dass er durch diesen (wie ich finde noch sehr ungenauen) Verweis gleich sieht "aha da steht die doch" sobald er die mit halbem Auge erkannt hat. Außerdem liefern verschiedene Prozeduren auch oft gleiche Ausgaben (gerade in Vorlesungsskripts), sodass hier ein stumpfes Implementieren nichts bringt und man sich mit dem Stoff tatsächlich auseinandersetzen muss.

Werde aber in Zukunft versuchen noch vager zu sein ;), dass das bloße Abschreiben der richtigen Lösung schädlich sein kann ist mir durchaus bewusst und war nicht meine Absicht.

waldinator

Praktikant

  • "waldinator" started this thread

Posts: 11

Date of registration: Nov 24th 2009

13

Thursday, December 3rd 2009, 9:44pm

Danke für die viele Hilfe :)

ich kannte zwar die tipps von Mar1k schon aber es hat trotzdem geholfen. Gut, wenn man von jemandem erfährt wenn der Ansatz z.B. schon total falsch ist und man mit dem Programm nix anfangen kann, weil der entscheidende Punkt ganz wo anders ist. Der Verweis auf das Kapitel war echt wichtig für mich, danke. Ich finde auch die Vorgehensweise von Mar1k nicht falsch, hab mir wirklich nochmal alles durchgelesen. Der entscheidende Punkt lag glaub ich bei dem null? und not pair? ich versuche das jetzt mal damit. Ohne dem Verweis auf das Kapitel hätte ich es nie gefunden und wär nicht schlauer geworden, danke ^^