Wer kennt sich mit Scheme aus?



  • Vielen Dank nochmal Dir!!

    Ich habe damit grad ein bisschen rumgespielt und ich habe mir ist der Fall eingefallen ...was wenn ich z.B. für Kilogramm 1000 eingebe? Ich meine, dann steht ja an der Stelle der Kilos 1000, aber eigentlich müsste automatisch +1 auf die Stelle der Tonnen gerechnet werden.
    Ist eigentlich irrelevant, weil das in der Aufgabenstellung nicht extra angegeben ist.
    Aber wenn, dann wäre die Bedingung eigentlich so in der Art zu programmieren wie du es bei der Addition unten gemacht hast oder? Weil da wird ja auch beim Addieren "übertragen".



  • Ja, genau. Wenn du das haben willst, musst du ein bisschen basteln. Am besten du löst das gleich über addiere, damit du keine hässlichen if-Abfragen im Code hast.

    Ich habe gerade mal den Code getestet und gesehen, dass addiere-hilf noch ziemlich falsch war. So ist es richtig:

    (define (addiere-hilf g1 g2 acc)
      (if (null? (cdr g1))
          (list (+ (car g1) (car g2) acc))
          (cons (modulo (+ (car g1) (car g2) acc) 1000)
    	    (addiere-hilf (cdr g1) (cdr g2)
    			  (if (> (+ (car g1) (car g2) acc) 999)
    			      1 0)))))
    


  • Achso ja...hab deswegen auch gestern etwas nachgedacht, weil davor ja stand > 999.

    Kannst du mir vielleicht noch sagen, dass wenn man im Modus "Fortgeschrittener" programmiert, wie man da Sachen ausgeben kann?

    Ich beziehe das auf "display..." weil der Befehl funktioniert da ja nicht.
    Ich habe es mit "string" versucht, aber das klappt auch nicht.



  • Diese verschiedenen Modi beziehen sich auf das Buch "How to design Programs". Es hat gewisse Ähnlichkeiten mit dem legendären "Structure and Interpretation of Computer Programs", allerdings ist es etwas praktischer orientiert (man nutzt viele Sachen von PLT-Scheme aus, zB wird recht früh schon die Grafik-Bibliothek von PLT vorgestellt). D.h. diese Modi benutzt man, wenn man dieses Buch liest. Alle paar-Hundert Seiten erhöht man dann in DrScheme das Sprachlevel. Und im Sprachlevel "Fortgeschrittener" gibt es wohl noch kein display; es wurde dem Leser noch nicht vorgestellt. Daher würde ich an deiner Stelle gleich R5RS nehmen oder besser, wenn du gar nicht vorhast, HtdP zu lesen, emacs und das zu Grunde liegende mzscheme benutzen. Macht das Leben wirklich einfacher.



  • Ja finde ich auch. Aber nachdem was diejenigen die im höheren Semestern mir sagen, ist es so, dass wir andauernd Sprachlevels vorgegeben bekommen und dann müssen wir das so machen, dass es unter dem läuft. Das finde ich recht blöd. Unter Einschränkungen zu programmieren macht ja nicht so viel Spass....



  • Ich würde gerne noch zu einer anderen Problemstellung was wissen wollen.

    Allgemein lautet die Aufgabe:

    Erstellen Sie eine Funktion (binominal n k) die einen rekursiven Prozess zur Ermittlung des Binominalkoeffizienten (n über k) erzeugt.

    Der Binominalkoeffizient ist so definiert:

    (n-1 über k) + (n-1) über k-1)

    wenn k = 0 oder k = n, dann soll 1 ausgegeben werden, ansonsten eben normal rekursiv...

    Bisher habe ich die Bedingung:

    (define (binominal n k)
      (if (or (= 0 k) (= k n)) 1
          2))
    

    An die Stelle der "2" muss natürlich das andere hin. Wollte nur schauen ob meine if bedingung ok ist.

    Ein rekursiver Prozess ist ja eigentlich nichts anderes als wenn sich die Funktion innerhalb selbst nochmal aufruft.

    Gibt es eine Möglichkeit in Scheme das "n über k" darzustellen?



  • Deine "Endbedingung" ist schonmal ok. Sie berücksichtigt allerdings keine Werte, bei denen k>n, bei denen du ja kein Binomialkoeffizient bilden kannst, aber danach ist wohl auch nciht gefragt.

    Der zweite Teil steht quasi schon in der Aufgabenstellung, du musst ihn nur noch in Scheme-Syntax konvertieren. Das sieht dann so aus:

    (define (binomial n k)
      (if (or (= k 0) (= n k))
          1
          (+ (binomial (- n 1) k)
    	 (binomial (- n 1) (- k 1)))))
    


  • Fast genau so habe ich das gemacht, außer dass ich "binominal" geschrieben habe... 😃

    Und wenn ich etwas zum berechnen eingebe, dann dauert dauert das...und plötzlich "zu wenig virtuellen Speicher..."

    Gibt es in Scheme eine Möglichkeit eine Stelle einer Zahl zu speichern bzw. an eine andere zu "verschieben" ?

    In dem Fall geht es darum eine Ganzzahl einzugeben und diese als Spiegelzahl auszugeben. Aber die Spiegelzahl muss "iterativ" ermittelt werden.
    Bedeutet ja so viel ich weiß nichts anderes, als dass die Prozedur wiederholt aufgerufen wird mit einem Abbruchkriterium.

    z.B. (reverse 110) --> 11

    Ich habe mir überlegt, dass die Zahl die ich eingebe (z.B. 110) durch die Anzahl der Stellen (10^anzahlStellen -1) in dem Fall durch 100 geteilt wird. Dann hätte man 1.10.

    Der Tutor hat uns den Tipp gegeben die Funktion "truncate float" zu benutzen und "modulo a b".

    truncate gibt ja die Zahl ohne Kommas aus, also würde es bei "truncate 1.10 --> 1 bedeuten. Die Zahl müsste ja nach ganz rechts.
    Wozu ich modulo brauchen sollte kann ich nicht so nachvollziehen.



  • dprzon schrieb:

    Fast genau so habe ich das gemacht, außer dass ich "binominal" geschrieben habe... 😃

    Und wenn ich etwas zum berechnen eingebe, dann dauert dauert das...und plötzlich "zu wenig virtuellen Speicher..."

    Eine Helferfunktion einführen (geht wahrscheinlich irgendwie mit labels, lambda, oder explizit hinschreiben, keine Ahnung) und die ganze Sache endrekursiv hinschreiben.

    Gibt es in Scheme eine Möglichkeit eine Stelle einer Zahl zu speichern bzw. an eine andere zu "verschieben" ?

    Eine Helferfunktion einführen, und alles wichtige in die Parameter packen.

    Wozu ich modulo brauchen sollte kann ich nicht so nachvollziehen.

    (modulo a 10) gibt dir die letzte Stelle der Zahl. (truncate (/ a 10)) schneidet sie weg.

    Reicht das als Tip?



  • (truncate (/ a 10)) funktioniert so nicht.
    Jetzt weiß ich zumindest wozu modulo.

    Eine Helferfunktion einführen, und alles wichtige in die Parameter packen.

    Das ist für mich noch zu abstrakt.
    Aber werde mal rumtesten.

    Danke!

    **EDIT: Hat sich erledigt. Hab jetzt auch das mit der Spiegelzahl geschafft. Das mit dem Binomialkoeffizienten hängt noch manchmal (je nachdem bei welchen Werten), aber es ist so ok...

    Vielen Dank nochmal besonders als Doktor Prokt!!**


Anmelden zum Antworten