-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现在几个星期,我不知道是什么标准格式化会为语言。我已经添加了一些评论,希望有所帮助。
'if'与'cond'没有任何关系。你的'cond'的括号太少,而且在你的原始文章中,你忽略了那些以未定义值而不是答案结尾的情况。特别是打印到底是什么使得返回值总是未定义的。 – Sylwester
这很奇怪,因为球拍没有给我一个语法错误,但仍然没有。此外,我相信我现在明白,如果我想要返回实际值,我应该定义总和。 – I2obiN
这是有效的,因为最后一个“pi”周围的括号成为了术语,而不是调用它将过程作为谓词进行评估的过程,并且参数变成了随后的表达式。没有语法错误,但几乎没有意图。看看我如何格式化你的原始代码。 – Sylwester