Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация функции elem, запарка! 
V
    Опции темы
Orcin
Дата 12.4.2005, 13:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я вот только начал изучать Лисп, и не могу написать одну функцию, назовем ее elem -
(elem N L) выбирает на верхнем уровне списка L |N|-тый элемент, отсчитанный от начала списка, если N>0, или от конца списка, если N<0, например:
(elem 2 ‘(a (12) b (3))) => (12)
(elem -2 ‘(a (12) b (3)) => b
вот. запутался на такой простой реализации!
подскажите, плиз, как тут быть?
и еще у меня 1 вопрос - если я запутался на таком простом задании, то, может, Лисп не для меня?? smile
заранее благодарю, господа! smile

  Вверх
Hidrag
Дата 13.4.2005, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно так:

(defun plus (n l) (if (= n 1) (first l) (plus (- n 1) (rest l))))
(defun minus (n l) (if (= n -1) (last l) (nth (+ (length l) n) l)))
(defun elem (n l) (if (> n 0) (plus n l) (if (< n 0) (minus n l))))

Как бы разбил твою функцию на три функции, можно это все в одну функцию слить, но это муторно, много проверок и условностей... как например тут не отработана проверка на n=0.
А насчет второго вопроса... а для кого этот Лисп вообще? smile мое мнение он нужен для преподов в ВУЗах, чтобы нас студентов им мучить )))) и для общего программерского развития, а так, практической ценности я в нем не вижу...


--------------------
user posted image
PM WWW ICQ   Вверх
svg
Дата 13.4.2005, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



что-то типа такого:
Код

(defun elem (n l)
        (let* ((len (length l)) 
                (en (if (>= n 0) (- n 1) (+ len n)))
                )
          (assert (and (>= en 0) (> len en)) (en) "Element number ~S exceeds list length ~S" n len)
          (nth en l)))


Цитата

и еще у меня 1 вопрос - если я запутался на таком простом задании, то, может, Лисп не для меня??


Это с непривычки, пройдет.
А вообще-то для изучения легче Scheme,а вот для работы лучше CommonLisp.

Это сообщение отредактировал(а) svg - 13.4.2005, 19:53
PM MAIL   Вверх
Lisper
Дата 16.4.2005, 00:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











>А насчет второго вопроса... а для кого этот Лисп вообще? мое мнение он нужен для >преподов в ВУЗах, чтобы нас студентов им мучить )))) и для общего программерского >развития, а так, практической ценности я в нем не вижу...

Действительно только людей отвращают от на самом деле весьма практически полезного языка. Хотя некоторым должно с ходу начинать нравиться. Вы случайно программы не блокноте пишите ? Рекомендую пользоваться редактором с подсветкой синтаксиса. Например из простых Corman Lisp (www.cormanlisp.com) это может, там и подсказка по функциям стандарта имеется.

Странно, Лисп таки преподают, но видать на столько скучно и бездарно, что студенты вешаются. Взяли бы за основу какую-нибудь книгу типа Practical Common Lisp или Anso Common Lisp Грэхэма, дело пошло бы веселее.

Кстати, когда подобные задачи дают на Си, иногда они бывают довольно пакостные, никто не говорит, что Си якобы практической ценности не имеет, и чем Лисп перед всеми так провинился ?




  Вверх
Hidrag
Дата 16.4.2005, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да ничем, на самом деле довольно интересный язык ...для тренировки мозгов, преподавать да, преподают у нас в ВУЗе, преподают ужасно, типа делается вот так и так.. а вот вам и задачи, думайте! smile И все...


--------------------
user posted image
PM WWW ICQ   Вверх
antisergey
Дата 21.5.2005, 21:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











(
defun elem
(
lambda (n l)
(
cond
((>= n 0) (nth n l))
(t (nth (- n) (reverse l)))
)
)
)

Если n>=0, то n-ый car от списка (n=0 - исходный список), если n<0, то (-n)-ый car от реверсированного списка (я писал в среде FORIS).
  Вверх
Cr@$h
Дата 24.8.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

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




M
Cr@$h
Hidrag и svg по ++ за помощь ньюбу.

PM MAIL ICQ   Вверх
Goganchic
Дата 11.4.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообще, Lisp считается более естественным языком, но я в этом сильно сомневаюсь ;)
PM Jabber   Вверх
_sg
Дата 24.4.2014, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



как вариант:
Код

(defun n-elm-n (w n)
  (nth (1- (abs n)) (if (plusp n) w (reverse w))))

> (n-elm-n '(1 2 3 4 5) 1)
1
> (n-elm-n '(1 2 3 4 5) -1)
5

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

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

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


 




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


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

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