Решение упражнения 1.3 из SICP

14 August, 2007 (22:13) | Решения упражнений

В третьем упражнении мы напишем самостоятельно первую процедуру.
Используем введенные в главе процедуры

(define (square a)  (* a a))  

(define (sum-of-squares a b) 
  (+ (square a) (square b)))

и запишем:

(define (sum-of-biggest-squares a b c) 
  (cond ((and (>= a c) (>= b c)) (sum-of-squares a b)) 
        ((and (>= a b) (>= c b)) (sum-of-squares a c)) 
        (else (sum-of-squares b c))))

Еще один очень элегантный вариант решения я обнаружил в комментариях к блогу Кена Дика:

(define (sum-of-biggest-squares a b c) 
  (sum-of-squares (max a b) (max (min a b) c)))

Comments

Comment from thror
Date: February 14, 2008, 12:00 pm

Держите еще один “элегантный” вариант

(define (f a b c)
  (+ (square a)
     (square b)
     (square c)
     (- (square (min a b c)))))

Comment from Sergey Khenkin
Date: February 14, 2008, 3:20 pm

Принимается 🙂

Comment from evgeny
Date: April 16, 2009, 7:27 pm

Можно и так:

(define (f x y z)
	(if (< x y)
			(sum-of-squares y (max x z))
			(sum-of-squares x (max y z))))

Comment from Juev
Date: August 22, 2009, 6:24 pm

Вот еще одно решение:

(defun my/square (x y z)
  "Возвращает сумму квадратов двух больших чисел"
  (defun square (x)
    "square x"
    (* x x))
  (defun sum_sq (x y)
    "sum square"
    (+ (square x) (square y)))
  (max (sum_sq x y) (sum_sq x z) (sum_sq y z)))

Comment from dmi3s
Date: September 29, 2009, 2:39 pm

(define (sum-of-biggest-squares a b c)
  (if (and (<= a b) (<= a c))
      (sum-of-squares b c)
      (sum-of-biggest-squares b c a)))

2 Juev: в условии ни где не сказано, что числа неотрицательны 😉

Comment from синдикат
Date: December 15, 2009, 5:08 pm

Сначала написал на Си, потом перевёл на Лисп. Косность мышления сказалась (=

(define (square x) (* x x))

(define (sqsum2 x y z)
  (if (> x y)
      (if (> y z)
          (+ (square x) (square y))
          (+ (square x) (square z)))
      (if (> x z)
          (+ (square x) (square y))
          (+ (square y) (square z)))))

Comment from Jura
Date: October 15, 2010, 11:00 am

Вот мое решение упражнения, довольно громоздко)

define (x (cond ((> a b)a)
                (else b)))
define (y (cond ((> c a) c)
                ((> c b) c)
                (else (cond ((> b a)b)
                            (else a)))))
define (square x) (* x x)
(+ (square x) (square y))

Comment from alexaled
Date: January 28, 2011, 10:23 am

а я наверное на быдлокодил, но работает

(define (qv x y z) 
   (+       (if (or (> x y) (> x z)) (* x x) 0)
            (if (or (> z y) (> z x)) (* z z) 0)
            (if (or (> y z) (> y x)) (* y y) 0)))

Comment from mare1988
Date: February 4, 2011, 2:00 am

а вот мой вариант

(define (maxone x y) 
  (if (> x y) x y))
(define (maxtwo x y z) 
  (if (> (maxone x y) z) 
      (maxone x y) z))

(define (square x) 
  (* x x))
(define (maxsumsquare x y z) 
  (+ (square (maxone x y)) 
     (square (maxtwo x y z))))

Comment from ggeinikus
Date: May 4, 2011, 10:52 pm

(define (hSum x y )
  (+(* x x)
    (* y y)))
(define (fMax x y )
  (cond ((>= x y) x)
        ((>= y x) y))
  )
(define (fMin x y)
  (cond ((<= x y) x)
        ((<= y x ) y))
)
(define (calc x y z)
  (hSum (fMax x y) (fMax (fMin x y) z)))

Comment from Dan
Date: October 23, 2011, 2:41 pm

(define (max a b) (if (> a b) a b))
(define (min a b) (if (< a b) a b))
(define (sum13 a b c)
  (define x (max (max a b) c))
  (define y (max (max (min a b) (min b c)) (min a c)))
  (+ (* x x) (* y y)))

Comment from Serg
Date: April 6, 2012, 12:30 pm

а вот так?

(cond ((> a b c)
      ((define (sum-of-squares a b)
           (+ (square a) (square b)))
                (define (square a) (* a a)))
     (else (sum-of-squares b c))))

Comment from Яр
Date: June 29, 2012, 3:39 pm

Cиндикат, у меня тоже так все мыслилось. Надо отвыкать от вредных привычек…

Comment from filimon
Date: September 3, 2012, 5:25 pm

У меня довольно громоздкое решение вышло. Я не знал про встроенные “min” и “max” и вообще ничего не знал кроме того, что успел до этого упражнения почерпнуть из книги. Так что вот такое вот решение получилось 🙂

(define (square x) (* x x))

(define (sum-of-squares x y)
  (+ (square x) (square y)))

(define (min-of-three x y z)
  (cond ((and (<= x y) (<= x z)) x)
        ((and (<= y x) (<= y z)) y)
        (else z)))

(define (f x y z)
  (cond ((= (min-of-three x y z) x)
         (sum-of-squares y z))
        ((= (min-of-three x y z) y)
         (sum-of-squares x z))
        (else (sum-of-squares x y))))





Comment from Privalov
Date: October 7, 2012, 5:02 pm

Такой вариант –

(define (sumsq a b) (+ (* a a)(* b b)))

(define (ups x y z)
(cond ((and (> x z) (> y z) )(sumsq x y)) 
          ((and (> z x) (> y x) )(sumsq z y)) 
          ((and (> z y) (> x y) )(sumsq z x)) 
))





Comment from Calibri
Date: October 17, 2012, 3:01 pm

У меня получился такой вариант:

(define (sqr x) (* x x))
(define (proc a b c)
  (if (>= a b)
      (+ (sqr a) (if (>= b c) (sqr b) (sqr c)))
      (+ (sqr b) (if (>= a c) (sqr a) (sqr c)))))

Comment from Феллини
Date: July 23, 2013, 7:25 pm

А вот и мой, элементарный, без подключения иных процедур.

(define (ex a b c)
	(cond ((> (and a b) c) (+ (* a a) (* b b)))
		 ((> (and b c) a) (+ (* b b) (* c c)))
		 (else (+ (* a a) (* c c)))))

Comment from yozas_gubka
Date: September 3, 2013, 12:45 pm

сколько людей столько и решений:)
я когда решал знал только про операторы перечисленные до главы 1.1.6 включительно:

(define (square x) (* x x))
(define (sum-of-biggest-squares a b c) 
        (+ (square (if (or (> a b) (> a c)) a 0)) 
            (square (if (or (> b a) (> b c)) b 0))
            (square (if (or (> c a) (> c b)) c 0))))

Comment from Ruslan
Date: December 13, 2013, 2:19 pm

Максимальный и меньший из двух больших.

(define (sum-of-squares-max-num a b c) (sum-of-squares (max a b c) (min (max a b) (max b c))))

Comment from Islam
Date: July 13, 2014, 1:36 pm

работает и с минусами))

(define (f a b c)
  (+ (square a)
     (square b)
     (square c)
     (- (square (min a b c)))))

Comment from Kirill
Date: February 16, 2015, 1:48 am

А такой покатит?

(define (f a b c)
    (+ (square (max a b))
         (square (max b c)))

Comment from scopych
Date: February 17, 2015, 12:35 pm

(define (squire a)
  (* a a))
(define (sum-of-squire a b)
  (+ (squire a)(squire b)))
(define (new-2bigq a b c)
  (if (and (< a b)
	   (< a c))
      (sum-of-squire b c)
      (if (and (< b a)
	       (< b c))
	  (sum-of-squire a c)
	  (sum-of-squire a b))))

Comment from Danil
Date: July 7, 2015, 1:53 pm

(define (maxch a b c)
(cond ((> a b) a)
      ((> a c) a)
      (else 0)))

(define (maxch1 a b c)
  (cond ((> b a) b)
        ((> b c) b)
        (else 0)))

(define (maxch2 a b c)
  (cond ((> c a)c)
        ((> c b)c)
        (else 0)))
(define (square a) (* a a))


(+ (square (maxch 4 5 6))
   (square (maxch1 4 5 6))
   (square (maxch2 4 5 6))
)

Comment from Abra-kadabr
Date: January 4, 2016, 7:26 pm

(define (square x) (* x x))
(define (sum-of-squares a b)
  (+ (square a) (square b)))


(define (sum-of-big-squares a b c)
  (if (and (< c a) (< c b))
      (sum-of-squares a b)
      (if (< b a)
          (sum-of-squares a c)
          (sum-of-squares b c))))

Comment from bulatenkom
Date: January 31, 2016, 11:08 am

(define (sos x y) (+ (* x x) (* y y)))
(define (f x y z) 
    (if (> x y)
        (if (> y z) (sos x y) (sos x z) )
        (if (< x z) (sos y z) (sos y x) )
    )
)

Без доп ф-ий min max.

Comment from bashe EAzy
Date: August 28, 2016, 12:09 pm

(define (kv x) (* x x))

(define (xui a b c) 
  (cond 
    ((and (or(> a b) (> a c)) (or(> b a) (> b c))) (+ (kv a) (kv b)))
    ((and (or(> b a) (> b c)) (or(> c a) (> c b))) (+ (kv b) (kv c)))
    ((and (or(> a b) (> a c)) (or(> c a) (> c b))) (+ (kv a) (kv c)))))

Comment from ublock-iblock
Date: November 19, 2016, 6:10 pm

(define (square x) (* x x))
(define (max x y) (cond ((> x y) x)
                        (else y)))
(define (min x y) (cond ((> x y) y)
                        (else x)))
(define (max-of-the-three-numbers a b c) (max (max a b) c))
(define (medium-of-the-three-numbers a b c) (min (min (max a b) (max a c)) (max b c)))
(define (sum-of-the-squares-of-the-two-largest-numbers a b c) (+ (square (max-of-the-three-numbers a b c))
                                                                 (square (medium-of-the-three-numbers a b c))))

Comment from Schwejk
Date: January 29, 2017, 5:46 pm

(define (sqr x)
  (* x x))
(define (sqrsum x y)
  (+ (sqr x) (sqr y)))
(define (>= x y)
  (or (> x y) (= x y)))
(define (f x y z)
  (if (>= x y)
      (if (>= y z)
          (sqrsum x y)
          (sqrsum x z))
      (if (>= x z)
          (sqrsum x y)
          (sqrsum y z))))

Comment from Markitan
Date: May 24, 2017, 12:49 pm

(define (sqr x) (* x x))
   (define (sqrs x y) (+ (sqr x) (sqr y)))
   (define (maxsqrs a b c)
   (cond     ((and (>= a c) (>= b c)) (sqrs a b))
		((and (>= a b) (>= c b)) (sqrs a c))
		(else (sqrs b c))
   ))

Write a comment