Seite 1 von 1

HA3 7

Verfasst: 13. Nov 2007 18:28
von caesar
hallo,

Code: Alles auswählen

(define (generate-all-pos startnum endnum)
  (cond
    [(< endnum startnum) false]
    [(>= endnum startnum)
     ((cons startnum empty) (generate-all-pos (+ startnum 1) endnum))]
  )
)
ich versuche den zweiten teil der hausarbeit als mit diesem code, es kommt aber immer wieder folgende Fehlermeldung: procedure application: expected procedure, given: (list 5); arguments were: false

Wenn ich es im Stepper verfolge sieht es so aus..

Code: Alles auswählen

((list 1)
 ((list 2)
  ((list 3)
   ((list 4)
    ((list 5) false)))))

Verfasst: 13. Nov 2007 18:55
von i3oot

Code: Alles auswählen

((cons startnum empty) (generate-all-pos (+ startnum 1) endnum))
Diese Zeile ist wohl der Schuldige. Es handelt sich um einen Funktionsaufruf, da er geklammert ist. Jedoch identifiziert das erste Argument keine Funktion, sondern die Liste, die durch (cons startnum empty) erzeugt wird.

Verfasst: 13. Nov 2007 19:05
von Stumpf.Alex
Einfach den Funktionsaufruf (generate-all-pos ....) mit empty ersetzen. Dann sollte es gehen.

Verfasst: 13. Nov 2007 19:15
von caesar
Wenn ich doch aber den Funktionsaufruf (generate-all-pos) durch empty ersetze, dann fällt meine komplette rekursion weg und ich kann nicht die startnum+1 erzeugen?!

Verfasst: 13. Nov 2007 19:21
von Stumpf.Alex
Ah, sorry, ich meinte das andersherum. empty muss natürlich ersetzt werden. ^^

Verfasst: 13. Nov 2007 22:20
von caesar
durch?^^

Verfasst: 13. Nov 2007 22:31
von ChRiZz88
Durch den hinteren Teil, das generate-all-pos, so wies da steht ;) Also (cons startnum (generate-all-pos usw..

Verfasst: 13. Nov 2007 22:35
von caesar
aber cons brauch doch als zweites argument eine liste.. wie soll ich denn so meine liste mit den zahlen erstellen, wenn ich cons versuche eine funktion zu geben?!

Verfasst: 13. Nov 2007 22:38
von Stumpf.Alex
generate-all-pos liefert dir doch eine Liste als Ergebnis! Siehe Contract.

Verfasst: 13. Nov 2007 22:39
von caesar
also doch eine hilfsprozedur mit einbauen..

Verfasst: 13. Nov 2007 22:42
von Stumpf.Alex
Nein. Einfach an stelle von empty das generate-all-pos gedöns einbauen. Das wars! Ich hoffe du weißt, dass du anstelle von Werten auch Funktionen einsetzen kannst, dir einen Wert ausgibt. Also applikative Ausführung.

Verfasst: 13. Nov 2007 22:49
von caesar
ja ist mir klar, aber das zweite argument eines cons muss eine liste sein, jedoch gibt das "generat-all-pos" - gedöns in jedem durchlauf nur einen Wert wieder. Jetzt ist aber Wert != Liste

Verfasst: 13. Nov 2007 22:49
von ChRiZz88
Jau, er führt dann generate-all-pos aus (hätte man des ned gen-row nennen können? :P) und merkt, dass des ne Liste is und schon is des cons n gültiger Ausdruck in dem Kontext..

Edit: Reaktion auf Vorposter xD
Dann haste generate-all-pos falsch implementiert... Bzw nochn Fehler drin

Achja, es wäre günstig, wenn du einen Fall hättest, bei dem er terminiert und zwar positiv terminiert, bisher hast du Folgendes:
Entweder:
Fehler
oder Rekursion solange bis Fehler

Oo kein Wunder, dass er irgendwann startnum solange erhöht hat, bis der erste Fall greift und du nen Fehler hast ;) Du brauchst noch nen Fall, bei dem er die Liste ausgibt ;)

Verfasst: 13. Nov 2007 22:57
von Stumpf.Alex
generate-all-pos : number number -> (listof number)

Also ist das Ergebnis eine Liste.

Verfasst: 13. Nov 2007 23:02
von caesar
oh ja...habs jetzt, lag echt an der terminierung, danke nochmal!