我应该写一个函数,打印一组给定的三个数字中两个更大数字的平方和.
我笨拙地处理了这种情况.我没有编写一个函数来返回一组3中的两个最大数字,而是编写了函数,以便表达式减少到所需的两个数字.#SSL功能.
我必须这样做的原因是我无法编写可以将多个值一起返回的LISP函数,并且我无法编写可以读取两个值作为参数的LISP函数.
有没有办法可以抽象出其他程序中最大数字的计算?
(define
(min a b)
(if (> a b) b a)
)
(define
(max a b)
(if (< a b) b a)
)
(define
(square a)
( * a a)
)
(define
(ssl a b c)
(+ (square (max a b)) (square (max (min a b) c)))
)
Run Code Online (Sandbox Code Playgroud)
像往常一样,将问题分解为更容易解决的子问题是个好主意; 我将解释如何编写解决方案,同时我将回答您的问题.首先,让我们找出三个中最大的两个数字并将它们返回到列表中 - 这是一种返回多个值的简单,可移植的方法:
(define (max-two a b c)
(if (>= a b)
(if (>= b c)
(list a b)
(list a c))
(if (>= a c)
(list b a)
(list b c))))
Run Code Online (Sandbox Code Playgroud)
现在让我们编写一个过程,将两个数字作为输入,对它们进行平方,然后添加结果 - 这就是我们如何声明一个接收多个值作为参数的函数:
(define (sum-square x y)
(+ (* x x) (* y y)))
Run Code Online (Sandbox Code Playgroud)
最后,让我们编写程序来获得答案 - 我们将apply用于将sum-square(接收两个参数的函数)应用于max-two(带有两个元素的列表)返回的结果- 这就是我们如何处理返回的多个值max-two:
(define (sum-max a b c)
(apply sum-square (max-two a b c)))
Run Code Online (Sandbox Code Playgroud)
结果如预期:
(sum-max 3 1 2)
=> 13
Run Code Online (Sandbox Code Playgroud)
这是SICP的练习1.3 ?(计算机程序的结构和解释)书。
此时,书中的清单尚未介绍,因此无需使用它们。这是我的解决方案(目前我正在学习SICP书籍)。
第一件事是拿出三个数字中最大的一个:
(define (getlargest a b c)
(if (> (if (> a b) a b) c) (if (> a b) a b) c)
)
Run Code Online (Sandbox Code Playgroud)
获得最大的读取:
第二件事是拿出中间数字:
(define (getmiddle a b c)
(cond ((= (getlargest a b c) a) (if (> b c) b c))
((= (getlargest a b c) b) (if (> a c) a c))
((= (getlargest a b c) c) (if (> a b) a b))
)
)
Run Code Online (Sandbox Code Playgroud)
getmiddle读取:
现在我们需要一个函数来计算两个数字的平方和:
(define (sqrsum x y)
(+ (* x x) (* y y))
)
Run Code Online (Sandbox Code Playgroud)
最后,主要功能:
(define (main a b c)
(sqrsum (getlargest a b c) (getmiddle a b c))
)
Run Code Online (Sandbox Code Playgroud)
通过将所有内容放入main中,我们可以将整个事情“黑箱化”:
(define (main a b c)
(define (getlargest)
(if (> (if (> a b) a b) c) (if (> a b) a b) c)
)
(define (getmiddle)
(cond ((= (getlargest) a) (if (> b c) b c))
((= (getlargest) b) (if (> a c) a c))
((= (getlargest) c) (if (> a b) a b))
)
)
(define (sqrsum x y)
(+ (* x x) (* y y))
)
(sqrsum (getlargest) (getmiddle))
)
Run Code Online (Sandbox Code Playgroud)