2016-12-16 4 views
-2

Ich fange an, Lisp in den Griff zu bekommen und ich versuche, eine Prozedur zu schreiben, um pi mit der Leibniz-Formel im Moment zu approximieren; Ich denke, ich bin in der Nähe, aber ich bin mir nicht sicher, wie es weitergehen soll. Das aktuelle Verhalten ist, dass es die erste Berechnung korrekt durchführt, aber dann wird das Programm beendet und zeigt die Nummer '1' an. Ich bin nicht sicher, ob ich eine definierte Funktion rekursiv wie folgt aufrufen können,Rekursiver Aufruf von Condition Branch

;;; R5RS 
(define (pi-get n) 
    (pi 0 1 n 0)) 

(define (pi sum a n count) 
    ;;; if n == 0, 0 
    (if (= n 0) 0) 
    ;;; if count % 2 == 1, + ... else -, if count == n, sum 
    (cond ((< count n) 
     (cond ((= (modulo count 2) 1) 
       (pi (+ sum (pi-calc (+ 2 a))) (+ a 2) n (+ count 1))) 
       (pi 
       (- sum (pi-calc (+ 2 a))) (+ a 2) n (+ count 1)))))) 

(define (pi-calc a) 
    (/ 1.0 a)) 

Entschuldigt, wenn dies ein wenig unleserlich ist, ich lerne gerade Lisp ein paar Wochen, und ich bin nicht sicher, was normale Formatierung würde sei für die Sprache. Ich habe ein paar Kommentare hinzugefügt, um hoffentlich zu helfen.

Antwort

0

Wie Sylwester erwähnte, stellte sich heraus, dass es ein Fehler bei der Syntax war.

;;; R5RS 
(define (pi-get n) 
(pi 1 1 n 0)) 

(define (pi sum a n count) 
(if (= n 0) 0) 
(cond ((< count n) 
    (cond ((= (modulo count 2) 1) 
      (pi (+ sum (pi-calc (+ 2 a))) (+ a 2) n (+ count 1))) 
      ((= (modulo count 2) 0) 
      (pi (- sum (pi-calc (+ 2 a))) (+ a 2) n (+ count 1)))) 
(display (* 4 sum)) (newline)))) 

(define (pi-calc a) 
(/ 1.0 a)) 
+1

'if' versus' cond' hat nichts damit zu tun. Sie hatten zu wenig Klammern für den "cond" und in bot Ihren ursprünglichen Beitrag und das ignorieren Sie Fälle, die als undefinierte Werte statt Antworten enden. Insbesondere der Druck am Ende ist der Grund dafür, dass der Rückgabewert immer undefiniert ist. – Sylwester

+0

Es ist seltsam, weil Racket mir keinen Syntaxfehler gab und immer noch nicht. Auch ich glaube ich verstehe jetzt, dass ich die Summe hätte definieren sollen, wenn ich einen tatsächlichen Wert zurückgeben wollte. – I2obiN

+0

Es war gültig, weil die Klammern um das letzte 'pi' der Begriff wurden, anstatt die Prozedur aufzurufen, bewertete es die Prozedur als das Prädikat und die Argumente wurden die konsequenten Ausdrücke. Kein Syntaxfehler, aber kaum die Absicht. Sehen Sie, wie ich Ihren ursprünglichen Code formatiert habe. – Sylwester