2016-12-16 42 views
-2

我開始接觸Lisp,我正在嘗試使用萊布尼茲公式來編寫一個近似pi的過程;我想我很近,但我不知道如何繼續。當前的行爲是它正確地進行了第一次計算,但程序終止並顯示數字「1」。我不確定我是否能像遞歸調用這個定義的函數,來自條件分支的遞歸調用

;;; 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)) 

道歉,如果這是一個有點不可讀,我剛學的Lisp現在幾個星期,我不知道是什麼標準格式化會爲語言。我已經添加了一些評論,希望有所幫助。

回答

0

正如Sylwester所說,它在我的語法部分被證明是一個錯誤。

;;; 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'與'cond'沒有任何關係。你的'cond'的括號太少,而且在你的原始文章中,你忽略了那些以未定義值而不是答案結尾的情況。特別是打印到底是什麼使得返回值總是未定義的。 – Sylwester

+0

這很奇怪,因爲球拍沒有給我一個語法錯誤,但仍然沒有。此外,我相信我現在明白,如果我想要返回實際值,我應該定義總和。 – I2obiN

+0

這是有效的,因爲最後一個「pi」周圍的括號成爲了術語,而不是調用它將過程作爲謂詞進行評估的過程,並且參數變成了隨後的表達式。沒有語法錯誤,但幾乎沒有意圖。看看我如何格式化你的原始代碼。 – Sylwester