我今天才开始学习Scheme。
我写了一个函数gcd()
,但它总是返回0
。
(define (gcd a b)
(cond (= b 0)
(a)
(else ((gcd b (modulo a b))))
)
)
为什么我错了?
我今天才开始学习Scheme。
我写了一个函数gcd()
,但它总是返回0
。
(define (gcd a b)
(cond (= b 0)
(a)
(else ((gcd b (modulo a b))))
)
)
为什么我错了?
这应该可以解决问题:
(define (gcd a b)
(cond [(= b 0) a]
[else (gcd b (modulo a b))]))
您在括号之间错误地包围了一些表达式,并且表达式中缺少一些括号cond
。
请注意,在 Scheme 中,当您将某些内容括在括号中时,假设(a)
您是在告诉解释器:a
是一个没有参数的过程,我想调用它,而这里不是这种情况,a
只是一个数字。
此外,为了便于阅读,最好使用[]
而不是()
分隔cond
表达式中的每个条件,如我上面的代码所示 - 但不要忘记它们,它们是强制性的,在你的代码中你忘记了它们第一个条件。
其他人已经描述了您的错误是什么以及您应该做什么。
考虑你的代码是如何实际运行的,以及为什么它会产生你看到的输出,这也是有益的。由于您缺少括号,您的第一个案例cond
是(= b 0)
. 将第一件事(=
)作为条件。Scheme 中的一切#f
都是真的,所以这总是真的。既然是真的,就评估这种情况。具体来说,括号中的其余内容被视为(可能的多个)表达式来评估,作为隐含的begin
. 所以基本上它评估(begin b 0)
. 结果是最后一个表达式的结果,0
。