方案:从一组三个数字中返回两个最大的数字

Dha*_*rav 1 scheme sicp

我应该写一个函数,打印一组给定的三个数字中两个更大数字的平方和.

我笨拙地处理了这种情况.我没有编写一个函数来返回一组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)

Ósc*_*pez 7

像往常一样,将问题分解为更容易解决的子问题是个好主意; 我将解释如何编写解决方案,同时我将回答您的问题.首先,让我们找出三个中最大的两个数字并将它们返回到列表中 - 这是一种返回多个值的简单,可移植的方法:

(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)


ikn*_*gic 5

这是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)

获得最大的读取:

  • 如果a大于b,则为a,否则为b
  • 取上一步的结果,并以相同的方式将其与c进行比较。
  • 返回a和b之间的最大值,如果c恰好大于a和b,则返回c。

第二件事是拿出中间数字:

(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读取:

  • 使用getlargest确定a或b或c是最大的数字。
  • 如果a是最大数,则将b与c进行比较,并返回b和c中的最大值;同样
  • 如果b最大,则将a与c进行比较,然后返回a和c中的最大值
  • 如果c是最大的,则将a与b进行比较,然后返回a和b的最大值

现在我们需要一个函数来计算两个数字的平方和:

(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)

  • 或者,我们不能只做 `(define (getsmallest abc) (if (&lt; (if (&lt; ab) ab) c) (if (&lt; ab) ab) c))`,然后对任何内容进行 `squaresum` 2 个不是最小的整数?我认为它稍微短一些,因为我们不必同时找到最大的和中间的:) (3认同)