(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语言,但这两种语言是完全不同的!
这是个问题 定义一个过程,该过程将三个数字作为参数,并返回两个较大数字的平方和。
如果你有更好的算法
发布消息!
谢谢:)
答案 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))))