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.

DarkWolve

Trainee

  • "DarkWolve" is male
  • "DarkWolve" started this thread

Posts: 36

Date of registration: Oct 9th 2007

Occupation: das frag ich mich auch o___O

1

Tuesday, November 6th 2007, 5:29pm

Scheme 3. Hausübung

Hi leutz,

nun ist es soweit, ich häng bei der 3. Hausübung leicht (aber nur ganz leicht...) fest!

1. war easy
2. schon etwas anspruchsvoller, vielleicht ne kleine Herausforderung

aber jetzt gehts los hier...

Aufgabenteil 1 der ersten Aufgabe hab ich gemacht,
den Iterativen prozess zu der unteren Funktion krieg ich nicht hin

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; Aufgabenteil 2
; Iterative alignments Funktion

(define (alignments-i n m)
  (align n m (max n m)))

(define (align n m l count)
  ([*](alignments-for-length n m l) ((alignments-for-length (+ n m)))))

(define (alignments-for-length n m l)
  (/ (fac l) (* (fac (- l m)) (fac (- l n)) (- (+ m n) l))))

; Iterative Fakultätsfunktion

(define (fac n)
  (fact-iter 1 1 n))

(define (fact-iter product counter max-count)
  (if (> counter max-count)
  	product
  	(fact-iter (* counter product)
             	(+ counter 1)
             	max-count)))


Da wo das Sternchen in den eckigen Klammern ist fehlt die Summenfunktion ( Bei [*])
und da bleibe ich auch irgendwie hängen, wie kann ich das da integrieren...

extern oder intern?
da muss ich doch das ganze nicht erst auswerten lassen und dann summieren
man muss doch das "l" immer + 1 + 1 usw. und das ganze erst addieren...
das ganze noch iterativ :cursing: ?( :cursing: ?( :cursing:


Aufgabenblatt gibts hier

This post has been edited 1 times, last edit by "DarkWolve" (Nov 6th 2007, 5:30pm)


  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

2

Tuesday, November 6th 2007, 6:54pm

Hinweis an alle:
Lasst euch nicht dazu hinreißen zu glauben, dass etwas, das jemand hier im Forum als "sein Lösungsansatz" gepostet hat, (wie der Codeschnipsel im obigen Post) auch wirklich richtig ist.

Außerdem möchte ich vorsorglich in dem Zusammenhang auf unsere Forenregeln hinweisen. Die verbieten es, Lösungen von Übungsaufgaben hier zu posten, also haltet die Beispiele, die eure die Fragen zu illustrieren sollen, bitte kurz und knapp!

______________


@DarkWolve:
Versuch mal, dir zu vergegenwärtigen, wie du das Problem in einer ich sag mal "gewöhnlichen" Programmiersprache angehen würdest... Warhscheinlich wäre das dann eine Schleife, in der du die Variable l von max{m,n} bis m+n hochzählst, oder? Und dabei würdest du wahrscheinlich bei jeden Schritt eine andere Variable verändern, die am Ende das Ergebnis enthalten soll.

Und dann kannst du überlegen, wie du so eine "Schleife" mit einer Laufvariablen und einer Ergebnisvariablen in Scheme implementieren könntest.

Und noch ein Tip: Überleg nochmal, was "lokale Hilfsprozedur" bedeutet. Besonders das "lokal"! :)

DarkWolve

Trainee

  • "DarkWolve" is male
  • "DarkWolve" started this thread

Posts: 36

Date of registration: Oct 9th 2007

Occupation: das frag ich mich auch o___O

3

Tuesday, November 6th 2007, 6:54pm

So,

bin ein kleines Stück weiter gekommen!

Source code

1
2
3
4
5
6
7
...
(define (align n m l count)
  (if (= (alignments-for-length n m l) (alignments-for-length n m (+ n m)))
  	(+ (alignments-for-length n m l) count)
  	(if (< n m) (+ (alignments-for-length n m l) count) (+ (alignments-for-length m n l) count)))
  (align (+ n 1) m l count))
...


nun hab ich das Problem an der 2. Rekursion, denn er nimmt bei "(alignments-for-length n m (+ n m))" für "n" das was ich weiter unten mit 1 addiert habe.
also endlosschleife weil l niemals n + m wird!

//EDIT

mh, gild der kleine Abschnitt schon Lösung? Ich nehms auch raus, aber eigentlich wenn es Forenregeln verletzt sollte es ja raus!

This post has been edited 2 times, last edit by "DarkWolve" (Nov 6th 2007, 7:02pm)


  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

4

Tuesday, November 6th 2007, 7:00pm

also endlosschleife weil l niemals n + m wird!
Wie sollte die Schleife auch enden, wenn du l nie veränderst?

DarkWolve

Trainee

  • "DarkWolve" is male
  • "DarkWolve" started this thread

Posts: 36

Date of registration: Oct 9th 2007

Occupation: das frag ich mich auch o___O

5

Tuesday, November 6th 2007, 7:06pm

naja anders herum

n+m ist ja l (in meinem Bsp)

und da n + 1 bei jeder Ausführung ausgeführt wird, wird im endeffekt auch l immer um einen größer!

und die differenz zwischen n und l ist immer 90 und ändert sich nicht!

Hilfsprozedur! Ich versuchs damit!

  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

6

Tuesday, November 6th 2007, 7:52pm


mh, gild der kleine Abschnitt schon Lösung? Ich nehms auch raus, aber eigentlich wenn es Forenregeln verletzt sollte es ja raus!
Der Teil deines Programms, der dir Probleme bereitet, ist ja zum Verständnis der Frage nötig. Und außerdem ist es keine Lösung weil es so nicht richtig ist. ;)


n+m ist ja l (in meinem Bsp)
Offensichtlich. Aber wie kommst du zu dem Schluss? Die Schleife soll mit l bei der größeren der beiden Zahlen m und n anfangen und zuende sein, wenn l den wert m+n erreicht hat.


Außerdem ist da noch ziemlich großer Fehler. Du brauchst ja eine Funktion die sich immer wieder selbst aufruft, bis die Abbruchbedingung erfüllt ist. Deine Funktion ruft sich hingegen jedes mal selbst auf. Und der einzige Wert, der sich von einem Aufruf zum nächsten ändert, ist bei dir n.

julianr

Erfahrener Schreiberling

Posts: 298

Date of registration: Oct 13th 2005

Location: I live in a giant bucket.

7

Wednesday, November 7th 2007, 1:03pm

Tipp, du hast in alignments-for-length noch einen kleinen Fehler—nur, damit du dich nicht über das falsche Gesamtergebnis wunderst, wenn der Rest stimmt :)

JanD

Trainee

  • "JanD" is male

Posts: 80

Date of registration: Dec 12th 2006

Location: Hannover

8

Thursday, November 8th 2007, 4:37pm

Also, ich denke es ist am einfachsten wenn du es etwa so sortierst:

Definiere dir innerhalb von alignments-i die prozedur alignments-for length mit einem einzigen Parameter (l).
Die Werte von m und n stehen dir aus der übergeordneten Prozedur alignments-i zur Verfügung.
Definiere dir innerhalb von alignments-for-length eine Fakultätsfunktion. (falls nich für andere Aufgaben schon vorhanden)
Dann schreibst du in alignments-for-length die Formel rein, wobei du wie gesagt m und n benutzen kannst, ohen sie nochmal extra zu übergeben.

Das wars mit der lokalen Hilfe, jetzt kommt deine "Schleife"
Du definierst einfach eine prozedur mit 2 Parametern, eines wird dein l zum zählen, dass andere ist die Summe.
Das Ding macht folgendes:
Wenn l größer als m + n ist (die Werte davon können auch hier von der übergeordneten Ebene bezogen werden) gibt es die aktuelle Summe zurück.
Ansonsten ruft es sich selbst auf, und zwar wird der Parameter l natürlich um eins erhöht und die neue Summe wird natürlich die Summe zuzüglich alignments-for-length von l.
Das wars für die Schleife, dann musst du als letzten Schritt innerhalb von alignments-i noch die Schleife aufrufen, l ist natürlich der größere Wert von m und n, und die Iitiale Summe ist 0.

Ich find das so ganz übersichtlich bei mir, liefert auch eiskalt das gewünschte Ergebnis, wenn jemand das an einer Stelle umständlich, unverständlich oder anders besser findet freue ich mich über Hinweise. Wir können ja auch nach dem Abgabetermin hier Quelltext zur kritischen Beäugung reinstellen und hören,w as die anderen davon halten. Natürlich nur, wenn das erlaubt ist, werd ich mal nachlesen ;)

MfG,
jan