Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
5 / 5 / 0
Регистрация: 26.11.2011
Сообщений: 18
1

GNU Common Lisp. сумма отрицательных элементов списка.

16.12.2011, 14:26. Просмотров 1477. Ответов 6
Метки нет (Все метки)

Дан список, к примеру '(-7 1 -2 4 9 -1 -3), нужно получить список '(-7 -2 -1 -3). в полученном списке подсчитать сумму. должно получиться '(-13 -10 -9 -7).
помогите, пожалуйста. в прологе данную задачу решила, а вот в Lisp'e не могу понять что делать(

Добавлено через 6 минут
полная формулировка задания звучит так:сформировать список L1 из элементов: сумма отрицательных элементов всего списка L, сумма отрицательных элементов из первых n-1 элементов L и т.д
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2011, 14:26
Ответы с готовыми решениями:

сумма ряда. GNU Common Lisp
вычислить сумму ряда 2/1+3/2...+(n+1)/n. у меня выводит ошибку в do, что не так??? (defun d (n) ...

Списки. GNU Common Lisp
1) сформировать список L1 из элементов: произведение всех элементов исходного списка L,...

GNU Common Lisp. списки
Здравствуйте. помогите решить задачу написать программу, реализующую тел.справочник. в нем...

Произведение ряда с двумя неизвестными GNU Common Lisp
Помогите, пожалуйста, новичку, в Lisp не понимаю ничего, а лабораторную завтра нужно сдать....

6
defun
598 / 612 / 44
Регистрация: 30.04.2011
Сообщений: 701
16.12.2011, 15:12 2
Lisp
1
2
3
4
5
6
7
8
(defun f (l)
           (let ((blackyui (remove-if #'plusp l)))
             (if (null l) blackyui
                 (cons (apply #'+ blackyui)
                       (f (butlast blackyui))))))
 
CL-USER> (f '(-7 1 -2 4 9 -1 -3))
(-13 -10 -9 -7)
(с) индусский код

Добавлено через 28 минут
или так
Lisp
1
2
3
4
5
6
(defun f (l)
           (loop for a on (reverse (remove-if #'plusp l))
                collect (apply #'+ a)))
 
CL-USER> (f '(-7 1 -2 4 9 -1 -3))
(-13 -10 -9 -7)
1
5 / 5 / 0
Регистрация: 26.11.2011
Сообщений: 18
16.12.2011, 15:38  [ТС] 3
спасибо большое!
я хотела бы уточнить по примененным функциям:
let - сопоставляет локальным переменным независимые выражения. С ее помощью можно
вынести из сложного определения любые совпадающие подвыражения.
В нашем случае что она выносит?

blackyui - произвольная функция/переменная. для чего мы используем?

plusp - проверяет положительность аргумента
apply - применяет функцию # (????) к списку аргументов.
butlast - возвращает копию списка без последней cons-ячейки. Если вызывается с целочисленным аргументом n, исключает последние n ячеек.

можете объяснить как они работают?
0
defun
598 / 612 / 44
Регистрация: 30.04.2011
Сообщений: 701
16.12.2011, 15:54 4
в blackyui храним список без положительных чисел, после этого проверяем, не пустой ли исходный список, если да, то возвращаем blackyui, если нет то начинаем строить новый список, первым элементом которого будет сумма элементов blackyui
Lisp
1
(apply #'+ blackyui)
а вторым, вызов f с "обрезанным с конца" blackyui.
blackyui - переменная.
ок?)

Добавлено через 6 минут
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(defun f (l)
           (let ((blackyui (remove-if #'plusp l)))
             (format t "blackyui -> ~a sum -> ~a~%" blackyui (apply #'+ blackyui))
             (if (null l) blackyui
                 (cons (apply #'+ blackyui)
                       (f (butlast blackyui))))))
 
CL-USER> (f '(-7 1 -2 4 9 -1 -3))
blackyui -> (-7 -2 -1 -3) sum -> -13
blackyui -> (-7 -2 -1) sum -> -10
blackyui -> (-7 -2) sum -> -9
blackyui -> (-7) sum -> -7
blackyui -> NIL sum -> 0
(-13 -10 -9 -7)
0
5 / 5 / 0
Регистрация: 26.11.2011
Сообщений: 18
16.12.2011, 15:57  [ТС] 5
во второй программе:
loop - макрос для организации цикли*ческих вычислений
что делает строка loop for a on ?
collect - макрос для внутреннего цикла?

Добавлено через 49 секунд
в первой поняла) а во второй программе?
0
defun
598 / 612 / 44
Регистрация: 30.04.2011
Сообщений: 701
16.12.2011, 16:02 6
Lisp
1
2
3
4
5
6
7
(loop for a on '(1 2 3 4 5)
              collect a)
((1 2 3 4 5) (2 3 4 5) (3 4 5) (4 5) (5))
 
(loop for a in '(1 2 3 4 5)
              summing a)
15
0
5 / 5 / 0
Регистрация: 26.11.2011
Сообщений: 18
16.12.2011, 16:03  [ТС] 7
поняла принцип работы. спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2011, 16:03

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Сумма элементов списка Lisp
Написать программу: задан список. Найти сумму первого, третьего и седьмого элементов списка, если...

Записать на языке Common Lisp форму для вывода списка значений функции y(x)
Пожалуйста поиогите с задачей: Записать на языке Common Lisp форму для вывода списка значений...

Clojure Сумма чисел от 0 до 100 в common lisp
Помогите решить задачу Сумма чисел от 0 до 100 в common lisp

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.