Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа нахождения ошибки. Почему то работает каждый не четный раз 
V
    Опции темы
Joil
Дата 15.3.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть функция:
Код

(defun er (e1 e2 e3)
          (cond ((null (null e1)) ())
                ((null e2) ())
                ((cond ((null e2) ())
                       ((null (listp (car e2))) (er e1 (cdr e2) e3))
                       (t t)
                 ) ())
                (t (+ 5 2))
          )
)


Должна она делать следующее: если первый список (е1) является не списком или не пустым списком функция выдает nil (это работает). Если второй список пуст, программа выдает nil.
Если второй список содержит в себе списки, то программа выдает nil (вот тут проблема), т. е если мы пишем (er () '((1) 2 3) '()), программа выдаtт nil, а вот если пишем (er () '(1 (2) 3) '()), то программа переходит к действию (+ 5 2). И так каждый не четный раз.
Че то не пойму, где запарка (туплю).

--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
Aristotelb
Дата 15.3.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все верно работает, функция рекурсивная и на втором шаге она возвращает nil:
Код

(er () '(1 (2) 3) '())

0 ER > ...
  >> E1 : NIL
  >> E2 : (1 (2) 3)
  >> E3 : NIL
  1 ER > ...
    >> E1 : NIL
    >> E2 : ((2) 3)
    >> E3 : NIL
  1 ER < ...
    << VALUE-0 : NIL
0 ER < ...
  << VALUE-0 : 7
7

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


Бывалый
*


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

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



Aristotelb спасибо, разобрался.

Вроде все работает, сделал вот так:
Код

(defun er (e1 e2 e3)
 (labels ((f1 (ef1 ef2 ef3) (cond ((null ef2) ())
                                  ((null (listp(car ef2))) (f1 ef1 (cdr ef2) ef3))
                                  (t T)) ))
 (labels ((f2 (ef1 ef2 ef3) (cond ((null ef3) ())
                                  ((listp (caddar ef3)) (f2 ef1 ef2 (cdr ef3)))
                                  (t T)) ))
          (cond ((null (null e1)) 'ERROR)
                ((null e2) 'ERROR)
                ((f1 e1 e2 e3) 'ERROR)
                ((f2 e1 e2 e3) 'ERROR)
                (t 'OK)
          )
 ))
)



Смысл функции думаю понятен - проверка на ошибки.
Т.е функйия должна быть такого формата: (er '() '(x1 ... xn) '((x11 x12)(...)(xn1 xn2))), если по другому программа выдает ERROR, но как видите я ее оформил, с помощью вспомогательных функций (labels), если кто сможет (я запарился, ниче не получается), пожалуйста помогите написать ее без вспомогательных функций (labels, flat).
Это для XLisp.

Это сообщение отредактировал(а) Joil - 16.3.2008, 16:13
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
Aristotelb
Дата 16.3.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Чет непойму смысл, e1 вседга д.б nil, e2 - список атомов, а е3 - список списков атомов? и никак иначе, тогда зачем е1 вообще нужен?
PM MAIL ICQ   Вверх
Joil
Дата 16.3.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



e1 вообще просто для примера надо, его потом не будет, с этой функцией и проблем нет, ее "ошибка" из одной строчки состоит.
А вообще, все правильно понял e1, всегда nil, e2 - список атомов, а e3 - список списков, в котором не больше 2-х атомов. (опаньки......, но и не меньше, а я про это забыл совсем... ща буду доделывать).
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
Joil
Дата 16.3.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Теперь вот так вот получается:
Код

(defun er (e1 e2 e3)
 (labels ((f1 (ef1 ef2 ef3) (cond ((null ef2) ())
                                  ((null (listp(car ef2))) (f1 ef1 (cdr ef2) ef3))
                                  (t T)) ))
 (labels ((f2 (ef1 ef2 ef3) (cond ((null ef3) ())
                                  ((listp (caddar ef3)) (f2 ef1 ef2 (cdr ef3)))
                                  (t T)) ))
 (labels ((f3 (ef1 ef2 ef3) (cond ((null ef3) ())
                                  ((null (listp (cadar ef3))) (f3 ef1 ef2 (cdr ef3)))
                                  (t T)) ))
          (cond ((null (null e1)) 'ERROR)
                ((null e2) 'ERROR)
                ((f1 e1 e2 e3) 'ERROR)
                ((f2 e1 e2 e3) 'ERROR)
                ((f3 e1 e2 e3) 'ERROR)
                (t 'OK)
          )
 )))
)


Просьба осталась: помочь в написании функции без labels.
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
Aristotelb
Дата 17.3.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

(defun and-list (f x) (eval `(and ,@(mapcar f x))))

(defun check-e2 (e) (and-list 'atom e) )

(defun check-e3 (e) (and (and-list 'listp e) 
                         (and-list 'check-e2 e)
                         (and-list (lambda (x) (= (length x) 2)) e)
))

(defun er (e1 e2 e3) (if (and (null e1)
                              (check-e2 e2)
                              (check-e3 e3))
                         'Ok
                         'ERROR
))

(er nil '(a b c) '((a b) (c d)))

>OK

(er nil '(a b c) '((a b) (c d e)))

>ERROR


P.S Делай проще
PM MAIL ICQ   Вверх
Joil
Дата 17.3.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, Aristotelb.  smile 
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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