2013-06-23 67 views
2

我刚开始学习Scheme。计划 - 我的gcd()总是返回零

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

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

为什么我错了?

+0

括号问题。使用一个好的IDE并正确缩进来避免这种麻烦,现在看看我的答案,看看出了什么问题。 –

+0

值得注意的是,您的gcd只有在a> = b时才能正常工作。 – carla

回答

8

这应该可以解决的问题:

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

你被错误地周围的括号之间的一些表情和一些括号里从cond表达缺失。

注意,在方案中,当你周围的东西在括号,说(a)你告诉翻译:a是不带参数的过程,我想调用它,这是不是在这里的情况,a是只是一个数字。

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

3

其他人已经描述了你的错误和你应该做的事情。

考虑代码如何实际运行以及为什么它会生成您看到的输出也很有指导意义。由于缺少括号,您的cond的第一个案例是(= b 0)。第一件事(=)被视为条件。除了#f以外的所有内容都是真实的,所以这一切都是真实的。既然这是事实,那么这个案例就会被评估。具体而言,括号中的其余部分被视为(可能多个)表达式来评估,作为隐含的begin。所以基本上它评估(begin b 0)。结果是最后一个表达式0的结果。