Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Среди элементов списка выбрать тот, который встречается в списке
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported_Pill imported_Pill вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.04.2007
По умолчанию Среди элементов списка выбрать тот, который встречается в списке - 16.04.2007, 16:19

Среди элементов списка, заданного в качестве первого аргумента, выбрать тот, который встречается в списке, заданном вторым аргументом. если ни один из элементов 1 списка не содержиться во 2, выдать текстовое сообщение.
вот такая задача, есть вроде функция first, которая по сути дела выполняет то, что написано в задаче, пыталась реализовать, ничего не получилось. Помогите добрым советом!!!
Ответить с цитированием
  (#2 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 16.04.2007, 16:49

Код:
(defun F (L1 L2)
  (cond
   ((null L2) nil);  в пустом списке 2 ничего не найдешь
   ((null L1) "Text"); список 1 пройден до конца, но ничего не найдено
   ((member (car L1) L2) (car L1)); если первый элемент списка 1 найден в списке 2, функция возвращает его
   (T (F (cdr L1) L2)))); в противном случае поиск повторяется для «хвоста» списка 1
Ответить с цитированием
  (#3 (permalink)) Старый
imported_Pill imported_Pill вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.04.2007
По умолчанию 16.04.2007, 17:14

я так понимаю, это решение задачи!!!!! спасибо. Ты так быстро ответил на вопрос, даже более, чем достаточно.
А почему ты не использовал first? и Поясни пожалуйста, почему ты не использовал if, там же вроде есть условия, или я чего-то не допоняла((
Ответить с цитированием
  (#4 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 16.04.2007, 17:58

Быстрый ответ - потому что простой вопрос (точнее, простая задача).
Теперь по вопросам:
1) Почему не использована функция (first)? Есть диалекты языка LISP, в которых нет встроенной функции (first). Конечно, можно ее определить, но незачем, если есть (даже не встроенная, а) базовая функция (car), выполняющая то же действие.
2) Почему не использована функция (if)? В языке LISP определена более универсальная по сравнению с (if) форма (cond), вполне подходящая для решения данной задачи.
Ответить с цитированием
  (#5 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 16.04.2007, 18:28

Для Sum(i=1..n)i^x:
Код:
(defun SUM (X N)
  (if (zerop N) 0
   (+ (expt N X) (SUM X (1- N)))))
Более защищенный вариант:
Код:
(defun SUM (X N)
  (cond
   ((minusp N) nil); на случай вызова функции с отрицательным n
   ((zerop N) 0)
   (T (+ (expt N X) (SUM X (1- N))))))
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
imported_Pill imported_Pill вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.04.2007
По умолчанию 16.04.2007, 19:47

Протестировала оба варианта... та же фигня
bad integer operation- (EXPT N X)....
говорят, что здесь надо самой описывать функцию возведения в степень.
Ответить с цитированием
  (#7 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 17.04.2007, 09:28

Вообще-то оба варианта работают. Это у Вас что-то с реализацией языка. Кстати, Вы в какой системе работаете?
В первом задании в принципе введение функции (mult) излишне. Кроме того, если в формуле Sum(x=1..m)a*x задан перебор x по возрастанию от 1 до m, было бы неплохо отреагировать на отрицательное значение m при вызове функции (типа защита от глупости пользователя) и вернуть в этом случае не 0 (который может получиться и при вполне правильном суммировании), а что-нибудь неожиданное типа nil.
Код:
(defun SUM_PROD (A M)
  (cond
   ((minusp M) nil)
   ((zerop M) 0)
   (T (+ (* A M) (SUM_PROD A (1- M))))))
Во втором задании можно попробовать воспользоваться равенством a^x=e^(x*lna)
Код:
(defun SUM_EXPT (X N)
  (cond
   ((minusp N) nil)
   ((zerop N) 0)
   (T (+ (exp (* X (log N))) (SUM_EXPT X (1- N))))))
Ответить с цитированием
  (#8 (permalink)) Старый
imported_Pill imported_Pill вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.04.2007
По умолчанию 17.04.2007, 13:19

у меня 2 оболочки XLISPPC и XLISPMS, но самое забавное, что функцию Log они тоже не воспринимают, я даже не знаю в чем проблема!!!!!! что мне делать???
Ответить с цитированием
  (#9 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 17.04.2007, 13:49

Могу выслать XLISP-PLUS 3.04, если в личном сообщении передадите адрес. Вероятно, оболочки неполные (может, какого куска математики нет?).
Ответить с цитированием
  (#10 (permalink)) Старый
imported_Pill imported_Pill вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.04.2007
По умолчанию 19.04.2007, 19:12

все таки препод сказал самой описывать функцию возведения в степень, я реализовала это следующим образом.

Код:
(defun expt (x n)
   (if (= n 1)
           x
           (* x (expt x (- n 1)))
   )
)   
(defun sum (x n)
   (if (= n 1)
           1
           (+ (expt n x)(sum x (- n 1)))
   )
)
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить два массива: с различными простыми числами среди элементов исходного массив maxim21 Pascal 0 09.04.2012 14:37
Посчитать количество четных и нечетных значений среди элементов массива dreamygirl Java 1 14.03.2011 09:52
Дан текст, для каждого из слов указать, сколько раз оно встречается среди слов текста wekze C++ Builder 8 19.02.2011 10:27
Удаление элементов списка, согласно номерам второго списка SWI-Prolog 5.8.2 imported__ro Prolog 11 13.01.2011 02:01
Написать программу преобразования списка которая реверсирует n элементов списка Ma3day Prolog 4 14.11.2010 14:07
В двумерном массиве среди отрицательных элементов найти сумму fightclub Assembler 5 10.01.2010 12:03
Определить сколько раз в списке встречается заданный объект AntiSemit Lisp 0 19.12.2009 20:46
Найти максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы emo12070 С/С++ 1 19.12.2009 19:50
Определите сколько раз в списке встречается заданный объект Makson Lisp 0 18.12.2009 10:33
Подсчитать сумму позиций, на которых в списке встречается элемент X elec Lisp 4 04.05.2009 14:09
Написать функцию, осуществляющую замену элементов в списке W списка Y Lass Lisp 5 06.05.2007 22:25
Как подсчитать минимум среди сумм модулей элементов диагоналей DaRkMaN Вопросы начинающих программистов 5 04.04.2005 20:42



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов