2

我今天才开始学习Scheme。

我写了一个函数gcd(),但它总是返回0

(define (gcd a b)
    (cond (= b 0) 
        (a)
     (else ((gcd b (modulo a b))))
    )
)

为什么我错了?

4

2 回答 2

8

这应该可以解决问题:

(define (gcd a b)
  (cond [(= b 0) a]
        [else (gcd b (modulo a b))]))

您在括号之间错误地包围了一些表达式,并且表达式中缺少一些括号cond

请注意,在 Scheme 中,当您将某些内容括在括号中时,假设(a)您是在告诉解释器:a是一个没有参数的过程,我想调用它,而这里不是这种情况,a只是一个数字。

此外,为了便于阅读,最好使用[]而不是()分隔cond表达式中的每个条件,如我上面的代码所示 - 但不要忘记它们,它们是强制性的,在你的代码中你忘记了它们第一个条件。

于 2013-06-23T13:59:59.693 回答
3

其他人已经描述了您的错误是什么以及您应该做什么。

考虑你的代码是如何实际运行的,以及为什么它会产生你看到的输出,这也是有益的。由于您缺少括号,您的第一个案例cond(= b 0). 将第一件事(=)作为条件。Scheme 中的一切#f都是真的,所以这总是真的。既然是真的,就评估这种情况。具体来说,括号中的其余内容被视为(可能的多个)表达式来评估,作为隐含的begin. 所以基本上它评估(begin b 0). 结果是最后一个表达式的结果,0

于 2013-06-23T23:18:32.133 回答