Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Задаxа на языке Lisp


Автор: dema2810 27.12.2011, 10:51
Дан массив из 15 вещественных чисел.Если минимальный элемент массива находится на 2 месте, а максимальный - на 1 месте массива, то все элементы массива уменьшить в 2 раза.

 Мы только проходили такие процедуры как: DEFUN,CAR,CDR,NULL,COND.
 помогите в решение плиз, очень нужна задачка последний зачет остался((
 заранее благодарен.

Автор: newbee 27.12.2011, 11:15
Код

(defun magic-list (list)
 (if (and
      (= (first list) (apply 'max list))
      (= (second list) (apply 'min list)))
  (mapcar (lambda (x) (/ x 2)) list)
  list))
Только я использовала не массив, а список.

Добавлено через 2 минуты и 10 секунд
В целях оптимизации стоит написать так, чтобы минимум и максимум находились за один проход списка, но, думаю, ты не станешь этого делать...

Автор: newbee 27.12.2011, 11:41
Цитата(dema2810 @  27.12.2011,  11:51 Найти цитируемый пост)
 Мы только проходили такие процедуры как: DEFUN,CAR,CDR,NULL,COND.
Фак. Прогрлядела этот момент. Тогда, чтобы мое решение тебе подошло, нужно вручную реализовать first, second, apply и mapcar и отказаться от lambda в пользу отдельной функции деления пополам... У меня есть эти реализации, чуть позже поищу, дам. Может кто раньше выложит свою решение.

Автор: newbee 27.12.2011, 13:43
Я сейчас посмотрела, дописать необходимые для моей реализации функции только на перечисленных тобой "процедурах" не получится, нужно решение задачи по-другому разворачивать. Сейчас может быть еще какие-нибудь лисперы подтянутся, сделают... Ну или мой вариант в крайнем случае можешь сдать... Типа сам еще несколько функций выучил )

Автор: dema2810 27.12.2011, 13:52
Цитата(newbee @ 27.12.2011,  13:43)
Я сейчас посмотрела, дописать необходимые для моей реализации функции только на перечисленных тобой "процедурах" не получится, нужно решение задачи по-другому разворачивать. Сейчас может быть еще какие-нибудь лисперы подтянутся, сделают... Ну или мой вариант в крайнем случае можешь сдать... Типа сам еще несколько функций выучил )

был такой вариант препод послал меня вмсесте с ним)

Автор: newbee 27.12.2011, 14:14
Эээх... С тебя печенька!

Код

(defun max-in-list (list &optional max)
 "Return maximal field in the list"
 (cond
  (list
   (max-in-list (cdr list)
                (cond
                 ((or (not max)
                      (> (car list) max))
                  (car list))
                 (t max))))
  (t max)))

(defun min-in-list (list &optional min)
 "Return minimal field in the list"
 (cond
  (list
   (min-in-list (cdr list)
                (cond
                 ((or (not min)
                      (< (car list) min))
                  (car list))
                 (t min))))
  (t min)))

(defun /2 (list)
 (cond
  (list (cons (/ (car list) 2) (/2 (cdr list))))))

(defun my-first (x)
 (car x))

(defun my-second (x)
 (car (cdr x)))

(defun magic-list (list)
 (if (and
      (= (my-first list) (max-in-list list))
      (= (my-second list) (min-in-list list)))
  (/2 list)
  list))

Автор: dema2810 27.12.2011, 14:44
ПАсибаааааааааааааааааааааааааааааа smile

Добавлено @ 14:48
(magic-list '(15 7 10 9 8 ))   вожу в консуле
ошибка: слишком мало аргументов smile 

Автор: newbee 27.12.2011, 15:00
Мммм а какой у тебя лисп? В Common Lisp все работает, только что проверила: (15/2 7/2 5 9/2 4)

Автор: dema2810 27.12.2011, 15:06
а дай плиз ссылочку на лис как у тя мож и правда у меня левый

Автор: newbee 27.12.2011, 15:14
http://www.sbcl.org/platform-table.html побробуй это.

Автор: k0rvin 28.12.2011, 13:33
Цитата(newbee @ 27.12.2011,  14:14)
Эээх... С тебя печенька!

Код

...

эй, так нечестно! у тебя кроме упомянутого набора еще '( or not > < / = )

Автор: newbee 28.12.2011, 13:38
Цитата(k0rvin @  28.12.2011,  14:33 Найти цитируемый пост)
эй, так нечестно! у тебя кроме упомянутого набора еще '( or not > < / = ) 
Ждем твоего варианта без использования функций сравнения и деления )

Автор: k0rvin 28.12.2011, 13:45
Цитата(newbee @ 28.12.2011,  13:38)
Ждем твоего варианта без использования функций сравнения и деления )

к сожалению, указанного автором набора недостаточно, чтобы решить данную задачу, так что не дождетесь =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)