2012-03-10 130 views
2

提示是定义一个返回三个数字中两个最大值的平方和的过程。SICP练习中的错误(练习1.3)

我知道这不完全是一个完美的解决方案,但是这是我砍死在一起:

(define (largest-of-two-sum-of-squares x y z) 
     (cond ((and (< x y) (< x z)) (sum-of-squares y z)) 
       ((and (< y z) (< y x)) (sum-of-squares x z)) 
       ((and (< z x) (< z y)) (sum-of-squares x y))))) 

什么我不知道是为什么我得到一个错误。

;The object 85 is not applicable 

单词对象后面的数字总是正确的答案,顺便说一句。我是一个计划初学者,它必须是我的语法中的东西?

谢谢

+1

你有一个多余的右括号。 – 2012-03-10 17:13:59

+2

6 6 6作为输入会发生什么? :-) – 6502 2012-03-10 17:43:01

回答

1

正如sindikat指出,一个多余的右括号。对于那个很抱歉。

+0

请将您的答案标记为正确的以关闭此问题:) – 2012-03-11 10:37:00

+1

这不是“正确的”,如果三个数字相等,则失败 – 2012-03-11 14:08:52

+2

@ÓscarLópez:或者两个相等并且低于另一个 – 6502 2012-03-11 14:24:24

3

这里的另一种可能的解决方案,这一项工作即使在所有这三个数是相等的,或者两个是比其他所有同等或更低的情况:

(define (sum-max a b c) 
    (define (sum x y) 
    (+ (* x x) (* y y))) 
    (if (>= a b) 
     (if (>= b c) 
      (sum a b) 
      (sum a c)) 
     (if (>= a c) 
      (sum b a) 
      (sum b c)))) 
+2

为什么downvote?我的解决方案是正确的,而且他OP已经在他的代码中发现了问题,我只是指出另一个选择。 – 2012-03-10 17:40:07

1

什么

(define (largest-of-two-sum-of-squares x y z) 
    (+ (square x) (square y) (square z) 
     (- (square (min x y z))))) 

+0

上面的解决方案当然是正确的,但考虑到SICP书中陈述练习1.3的要点,读者不应该“知道”'min'程序。只有条件表达式才会被允许 – 2012-03-11 22:24:30