Recursion 来自条件分支的递归调用

Recursion 来自条件分支的递归调用,recursion,scheme,r5rs,Recursion,Scheme,R5rs,我开始学习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, + ...

我开始学习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,我不确定该语言的正常格式是什么。我添加了一些评论,希望能有所帮助。

正如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))

如果与康德无关。你的第二个括号太少了,在你的原始帖子中,你忽略了一些案例,这些案例最终成为未定义的值,而不是答案。特别是最后的打印使得返回值始终是未定义的。这很奇怪,因为Racket没有给我一个语法错误,现在仍然没有。此外,我相信我现在明白了,如果我想返回一个实际值,我应该定义sum。它是有效的,因为最后一个pi周围的括号成为术语,而不是调用过程,它将过程作为谓词进行计算,参数成为结果表达式。。没有语法错误,但几乎没有意图。看看我是如何格式化你的原始代码的。还有一个问题是关于sum的。我应该给它下定义吗?这里的最佳实践是什么?