Scheme - 我的gcd()总是返回零

时间:2013-06-23 13:58:03

标签: lisp scheme greatest-common-divisor

我今天刚开始学习Scheme。

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

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

为什么我错了?

2 个答案:

答案 0 :(得分:8)

这应解决问题:

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

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

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

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

答案 1 :(得分:3)

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

考虑如何实际运行代码以及为什么它会产生您看到的输出也是有益的。由于您遗漏了括号,cond的第一个案例是(= b 0)。第一件事(=)被视为条件。除了#f之外,Scheme中的所有内容都是正确的,所以这始终是正确的。因为确实如此,所以评估这种情况。具体来说,括号中的其余部分被视为(可能的多个)表达式进行评估,作为隐式begin。所以基本上它评估(begin b 0)。结果是最后一个表达式0

的结果