Lisp Scheme-my gcd()始终返回零

Lisp Scheme-my gcd()始终返回零,lisp,scheme,greatest-common-divisor,Lisp,Scheme,Greatest Common Divisor,我今天才开始学习这个计划 我编写了一个函数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表达式中

我今天才开始学习这个计划

我编写了一个函数
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
表达式中的每个条件,如上面的代码所示-但不要忘记它们,它们是强制性的,在您的代码中,您在第一个条件中忘记了它们。

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


考虑你的代码是如何运行的以及为什么它会产生你看到的输出也是有启发性的。由于缺少括号,因此
条件的第一个大小写是
(=b0)
。第一件事(
=
)作为条件。Scheme中除了
#f
之外的所有内容都是真的,所以这总是真的。由于这是事实,因此对该案例进行了评估。具体来说,括号中的其余内容作为(可能的多个)表达式进行计算,作为隐式的
begin
。因此,基本上它计算
(beginb0)
。结果是最后一个表达式的结果,
0

括号问题。正确使用一个好的IDE和缩进来避免这种麻烦,现在看看我的答案,看看哪里出了问题。值得注意的是,gcd只有在a>=b时才有效。
(define (gcd a b)
    (cond (= b 0) 
        (a)
     (else ((gcd b (modulo a b))))
    )
)