2016-12-16 45 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