一个基本的Lisp程序错误

时间:2012-09-13 04:42:29

标签: lisp scheme racket

(define (sum-two-sqrt a b c)

    (cond ((and (<= c a) (<= c b)) sqrt-sum(a b))
           ((and (<= a b) (<= a c)) sqrt-sum(b c))
           ((and (<= b a) (<= b c)) sqrt-sum(a c))
    )
)
(define (sqrt-sum x y)
           (+ (* x x) (*y y))
)
(define (<= x y)
      (not (> x y))

(sum-two-sqrt 3 4 5)

这是我的代码

请帮我解决问题。 :)

我今天刚开始研究Lisp。

之前学过一些C语言,但这两种语言是完全不同的!

这是个问题 定义一个过程,该过程将三个数字作为参数,并返回两个较大数字的平方和。

如果你有更好的算法

发布消息!

谢谢:)

4 个答案:

答案 0 :(得分:3)

没有必要定义<=,这是一个原始操作。修好几个拼写错误后:

  • sqrt-sum:你错误地调用了这个程序;左括号必须在之前写入程序名称,而不是之后
  • sqrt-sum(*y y)不正确,您肯定是(* y y);操作员事后的空间。

这应该有效:

(define (sqrt-sum x y)
  (+ (* x x) (* y y)))

(define (sum-two-sqrt a b c)
  (cond ((and (<= c a) (<= c b)) (sqrt-sum a b))
        ((and (<= a b) (<= a c)) (sqrt-sum b c))
        ((and (<= b a) (<= b c)) (sqrt-sum a c))))

或另一种选择:

(define (sum-two-sqrt a b c)
  (let ((m (min a b c)))
    (cond ((= a m) (sqrt-sum b c))
          ((= b m) (sqrt-sum a c))
          (else (sqrt-sum a b)))))

答案 1 :(得分:1)

根据@ J.Spiral提出的建议并由@River借调,下面的Racket代码很好地告诉我:

#lang racket

(define (squares-of-larger l)
  (define two-larger (remove (apply min l) l))
  (for/sum ([i two-larger]) (* i i)))

(squares-of-larger '(3 1 4)) ;; should be 25

请注意,此解决方案完全正常,因为“删除”只会返回一个新列表。

另请注意,这与HtDP在同一社区中并不存在;我只是想简明扼要地表达一下,并为/ sum展示。

答案 2 :(得分:0)

算法似乎有效,只需转动

*y

* y

空格在这里很重要,否则你告诉翻译你要使用函数*y

之后添加一个关闭的paren
(define (<= x y) (not (> x y))

sqrt-sum(a b) 

转向

(sqrt-sum a b)

和其他sqrt-sum调用的同上

编辑也有可能:

(define (square a) (* a a))
(define (square-sum a b c)
    (- (+ (square a) 
          (square b)
          (square c))
       (square (min a b c))))

答案 3 :(得分:0)

我这里没有Scheme解释器,但是下面似乎比其他建议更短:)所以它在CL中,但在Scheme中应该看起来非常相似。

(defun sum-two-sqrt (a b c)
  (let ((a (max a b))
        (b (max (min a b) c)))
    (+ (* a a) (* b b))))

在Scheme中,这将转换为:

(define (sum-two-sqrt a b c)
  (let ((a (max a b))
        (b (max (min a b) c)))
    (+ (* a a) (* b b))))