来自条件分支的递归调用
Recursive call from Condition Branch
我开始掌握 Lisp,目前我正在尝试编写一个程序来使用莱布尼茨公式来近似圆周率;我想我很接近,但我不确定如何进行。当前的行为是它正确地进行了第一次计算,但随后程序终止并显示数字“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))
我开始掌握 Lisp,目前我正在尝试编写一个程序来使用莱布尼茨公式来近似圆周率;我想我很接近,但我不确定如何进行。当前的行为是它正确地进行了第一次计算,但随后程序终止并显示数字“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))