> 1 <

Автор Сообщение

Antonio

Members


Статус

1 сообщений

Где: Russia
Род занятий:
Возраст:

#5435   2012-01-04 23:12 GMT+3 часа(ов)      
Добрый день. Начал изучать LISP и выбрал для себя Scheme как диалект. Вообще предмет программирования для меня нов (до этого немного писал скрипты на питоне, но это бытовой уровень). В книге наткнулся на задачу 1.3 - определить процедуру которая принимает в качестве аргумента 3 числа и возвращает сумму квадратов больших из них).
Решил следующим способом:

#lang scheme
(define (max a b c)
(cond ((and (> a c) (> b c)) (+ (* a a) (* b b)))
((and (> a b) (> c b)) (+ (* a a) (* c c)))
((and (> b a) (> c a)) (+ (* b b) (* c c)))
))
(max 4 2 3)


Вижу что очень коряво и прямолинейно. Вопрос в следующем - можно ли это сделать более изящно?

отредактировал(а) Antonio: 2012-01-05 04:03 GMT+3 часа(ов)

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#5436   2012-01-05 00:56 GMT+3 часа(ов)      
сложить квадраты всех чисел за исключением минимального. Может, можно и проще.
(defun foo(a b c)
(apply (lambda(a b)(+ (* a a)(* b b)))
(remove (min a b c) (list a b c))))

Или как сумму наибольшего из первых, и наибольшего из третьих и наименьшего из первых
(defun bar(a b c)	
(if (> a b)
(+ (* a a) (if (> b c) (* b b) (* c c)))
(+ (* b b) (if (> a c) (* a a) (* c c)))))
Или скрестить
(defun foobar(a b c)
(apply (lambda(a b)(+ (* a a)(* b b)))
(if (> a b) (list a (max b c)) (list b (max a c)))))

Ещё
(defun foo(x y &optional (z nil))
(if (null z)
(expt (max x y) 2)
(if (> x y)
(+ (* x x) (foo y z))
(+ (* y y) (foo x z)))))

Это CL, так что не будет отвлекать от самостоятельного решения.
Или на clj
(defn foo
([x y] (if (> x y) (* x x) (* y y)))
([x y z] (if (> x y)
(+ (* x x) (foo y z))
(+ (* y y) (foo x z)))))

отредактировал(а) megamanx: 2012-01-05 19:47 GMT+3 часа(ов)
I wish I'd made you angry earlier

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5437   2012-01-05 03:49 GMT+3 часа(ов)      
#lang r5rs
(define (f1 a b c)
(let ((m (max a b))
(k (max b c)))
(+ (* m m) (* k k))))
(define (f2 a b c)
(+ (expt (max a b) 2)
(expt (max b c) 2)))

отредактировал(а) misha: 2012-01-05 03:59 GMT+3 часа(ов)

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#5439   2012-01-05 10:03 GMT+3 часа(ов)      
Цитата
misha :
#lang r5rs
(define (f1 a b c)
(let ((m (max a b))
(k (max b c)))
(+ (* m m) (* k k))))
(define (f2 a b c)
(+ (expt (max a b) 2)
(expt (max b c) 2)))



если b максимально, то не будет работать.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5440   2012-01-05 13:45 GMT+3 часа(ов)      
>если b максимально, то не будет работать.
Конечно, не будет работать Пускай он сам ошибку исправит.
> 1 <


Онлайн :

0 пользователь(ей), 28 гость(ей) :




Реклама на сайте: