Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите переделать решение 
V
    Опции темы
Metalex
Дата 2.12.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Пожалуйста, помогите переделать мое решение данной задачи:

На вход подается список чисел (A). Вычислить новый список чисел (B), где
Bi = среднему арифметическому всего списка A, кроме Ai. Т.е. 
если есть список (1 2 3), 
то B1 = (2+3)/2;
     B2 = (1+3)/2;
     B3 = (1+2)/2;

Код

(Defun sum(L N)
       (DO ((R 0))
           ((NULL L) R)
         (IF (EQL N 0) (SETQ L (CDR L) N (- N 1))
         (SETQ R (+ R (CAR L)) L (CDR L) N (- N 1)))))

(Defun res(L &optional R)
       (SETQ N 0 SIZE (Length L) LSIZE (- SIZE 1))
       (LOOP
        (IF (EQL SIZE N) (RETURN R)) 
         (SETQ S (sum L N))
         (IF (EQL R NIL) (SETQ R (/ S LSIZE)) (SETQ R (cons R (/ S LSIZE))))
         (SETQ N (+ N 1))))

(Defun mres(L)
       (cond ((EQL (Length L) 1) NIL)
         (T (res L))))


Результат:

Код

> (mres '(2 3 5 6))
(((14/3 . 13/3) . 11/3) . 10/3)


Необходимо, чтобы программа возвращала список, а не консы. Спасибо.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
_sg
Дата 2.12.2012, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 16.5.2007

Репутация: 2
Всего: 2



Код

(defun average-sine (w &aux (n (1- (length w))) (m (apply #'+ w)))
  (when (> n 1) (mapcar #'(lambda (a) (float (/ (- m a) n))) w)))

> (average-sine '(2 3 5 6))
(4.6666665 4.3333335 3.6666667 3.3333333)

или:
Код

(defun average-sine (w &aux (n (1- (length w))) (m (apply #'+ w)))
  (when (> n 1) (mapcar #'(lambda (a) (/ (- m a) n)) w)))

> (average-sine '(2 3 5 6))
(14/3 13/3 11/3 10/3)


Это сообщение отредактировал(а) _sg - 2.12.2012, 19:07
--------------------
vk.com/ansicommonlisp
PM MAIL   Вверх
Metalex
Дата 2.12.2012, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



_sg, и снова большое спасибо  smile 

Мне стоило полностью написать задание, там сказано, что надо использовать do и loop.
Ваше решение я изучу как более реальный, а не учебный вариант.

Возможно ли исправить мое с консов на список?


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
_sg
Дата 2.12.2012, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 16.5.2007

Репутация: 2
Всего: 2



Здорово, что Вам удалось получить результат, Ваше решение сложно доработать, обычно в Лиспе не присваивают значения переменным, а используют вложение функций - одна функция принимает аргументы и возвращает результат, который, в свою очередь является аргументом другой функции и т. д., например (function3 (function2 (function1 arg))), если нельзя обойтись без присваивания, то чаще используют не setq, а let или let* (про setq и setf лучше забыть):
Код

-+  Warnings (14)
 |-- N is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- N is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- LSIZE is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- S is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- LSIZE is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- S is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- S is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- N is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- N is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- SIZE is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- LSIZE is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- SIZE is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 |-- SIZE is neither declared nor bound,
 |   it will be treated as if it were declared SPECIAL.
 `-- N is neither declared nor bound,
     it will be treated as if it were declared SPECIAL.
 
вариант с loop:
Код

(defun average-sine (w)
  (loop for a in w collect (/ (- (apply #'+ w) a) (1- (length w)))))

> (average-sine '(2 3 5 6))
(14/3 13/3 11/3 10/3)

или:
Код

(defun average-sine (w &aux (n (1- (length w))) (m (apply #'+ w)))
  (loop for a in w collect (/ (- m a) n)))

> (average-sine '(2 3 5 6))
(14/3 13/3 11/3 10/3)

Код

(defun average-sine (w)
  (let ((n (1- (length w))) (m (apply #'+ w)))
        (loop for a in w collect (/ (- m a) n))))

> (average-sine '(2 3 5 6))
(14/3 13/3 11/3 10/3)

можете попробовать переделать цикл loop в do или dolist.


Это сообщение отредактировал(а) _sg - 2.12.2012, 23:34
--------------------
vk.com/ansicommonlisp
PM MAIL   Вверх
_sg
Дата 3.12.2012, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 16.5.2007

Репутация: 2
Всего: 2



при помощи labels - обернуть во вложенную функцию average c параметрами n = (1- (length w)) и m = (apply #'+ w):
Код

(defun average-sine (w)
  (labels ((average (n m)
             (loop for a in w collect (/ (- m a) n))))
    (average (1- (length w)) (apply #'+ w))))

> (average-sine '(2 3 5 6))
(14/3 13/3 11/3 10/3)

или lambda - обернуть во вложенную безымянную функцию c параметрами n = (1- (length w)) и m = (apply #'+ w):
Код

(defun average-sine (w)
  ((lambda (n m)
     (loop for a in w collect (/ (- m a) n)))
   (1- (length w)) (apply #'+ w)))

> (average-sine '(2 3 5 6))
(14/3 13/3 11/3 10/3)

--------------------
vk.com/ansicommonlisp
PM MAIL   Вверх
Catstail
Дата 8.2.2013, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 14.1.2013

Репутация: нет
Всего: нет



А так:

Код


(defun task (lst)
  (let ((n (- (length lst) 1)) (sum (apply '+ lst)))
    (iter (for x in lst) (collecting (/ (- sum x) n)))))

==> task

(task '(2 3 5 6))

==> (4.66666666666667 4.33333333333333 3.66666666666667 3.33333333333333)


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.