List, Scheme oder Prolog: Wie kann ich bei funktionalen Programmiersprachen Werte zurückgeben?



  • Hi,

    also ich bin grad dabei mich mit der funktionalen Prg. zu beschäftigen. Scheint alles recht interessant und hilfreich zu sein, nur leider krieg ich keine Wertrückgabe hin. In C++ geht das ja via Referenzparametern (&), nur das ist ein ganz anderer Schuh.

    Folgendes simples Problem funktioniert einwandfrei und erscheint auch logisch:

    (define (addiere_ a b)
      (+ a b))
    
    (define (berechne_ a b c)
      (* c (addiere_ a b)))
    

    Der Wert wird zurückgegebn, indem ich die Funktion aufrufe und die ja einen Wert zurückgibt.

    Doch ich möchte mit folgendem Programm erreichen, dass alle Möglichkeiten für folgende Gleichung mit 3 Unbekannten gefunden werden:

    2e + 2s + n = 43 [e != s != n]
    [e, s, n € natürliche Zahlen einschließlich 0]

    Hier mein Code, die Lösungen funktionieren auch, nur gibt der die Anzahl der gefundenen Lösungen nicht aus, da der Parameter "anzahl" scheinbar nie zurückgegebn wird und daher immer den Wert 0 hat:

    (define (moeglich e s n anzahl)
      (cond ((and (not (= e s)) 
                  (not (= s n)) 
                  (= 43 (+ (* 2 e) (* 2 s) n))) 
             (begin
               (display e)(display " ")
               (display s)(display " ")
               (display n)(display " ")
              (+ anzahl 1)(display anzahl)
               (newline)))                
             (else #F)))
    
    (define (go_n k j l anzahl)
      (cond ((< l 42)
             (begin
               (moeglich k j l anzahl)
               (go_n k j (+ l 1) anzahl)
               ))
            (else #F)))
    
    (define (go_s k j l anzahl)
      (cond ((< j 22) 
             (begin
               (go_n k j 0 anzahl)
               (go_s k (+ j 1) l anzahl)
               ))
            (else #F)))
    
    (define (go i anzahl)
      (cond ((< i 22) (begin
               (go_s i 0 0 anzahl)
               (go (+ i 1) anzahl)
               ))
            (else #F)))
    

    Die Anzeige ist dann entsprechend "falsch" (ich habe falsch programmiert), denn der letzte Wert (gefundene Möglichkeiten) ist immer 0 😞

    ...
    17 4 1 0
    18 0 7 0
    18 1 5 0
    18 2 3 0
    18 3 1 0
    19 0 5 0
    19 1 3 0
    19 2 1 0
    20 0 3 0
    21 0 1 0



  • Problem hat sich gelöst. Kleiner Denkfehler 🙄


Anmelden zum Antworten