Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите разобраться с програмкой 
:(
    Опции темы
nikos89
Дата 27.10.2011, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написать программу удвоения всех атомов в подсписках любого нечетного уровня, начиная с единицы, и утроения всех атомов в подсписках любого четного уровня, начиная с 0. Атомы приписывать после последнего элемента в подсписке. 

Код

; Утраивает атомы в текущем списке
(defun triplicate (lista)
    (if (eq lista nil)
        (princ)
        (if (atom (car lista))
            (list (car lista)
                   (triplicate (cdr lista))
                   (car lista)
                   (car lista)
            )
            (list
               (duplicate (car lista))
               (triplicate (cdr lista))
            )
        )
    )
)

; Удваивает атомы в текущем списке
(defun duplicate (lista)
    (if (eq lista nil)
        (princ)
        (if (atom (car lista))
            (list (car lista)
                   (duplicate (cdr lista))
                   (car lista)
            )
            (list
               (triplicate (car lista))
               (duplicate (cdr lista))
            )
        )
    )
)

; Главная функция
(defun execute (baseList) 
  (triplicate baseList)
)

(execute '(a с (e f)) )


Получается вот такая вещ (A (С ((E (F  F) E) ) С С) A A) . А должно быть вот  так (A С (E F  F E ) С С A A). 
Что не так не понимаю!! Откуда появляются лишние скобки???!!! 
PM MAIL   Вверх
newbee
Дата 27.10.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Во-первых, на лиспах так не пишут, глаза сломать можно от такого форматирования.
Во-вторых, "скобочки" лишние, потому что ты всюду в список добавляешь другие списки вместо того, чтобы объединять их друг с другом.
Ну и в-третьих, я бы сделала так:
Код

(defun atom-adder (list)
 (labels ((adder (list recn alist acc)
           (if (null list)
            (append (nreverse alist) acc)
            (if (listp (car list))
             (adder (cdr list) recn (cons (adder (car list) (+ 1 recn) nil nil) alist) acc)
             (adder (cdr list) recn (cons (car list) alist)
              (append acc
               (make-list (if (= 0 (mod recn 2)) 1 2)
                :initial-element (car list))))))))
  (adder list 1 nil nil)))

Цитата
(atom-adder '(a (b (q)) 1 ((x) y (z)) d)) => (A (B (Q Q Q) B) 1 ((X X X) Y (Z Z Z) Y) D A A 1 1 D D)
(atom-adder '(a c (e f)))  => (A C (E F E F) A A C C)


Это сообщение отредактировал(а) newbee - 27.10.2011, 14:55


--------------------
You're face to face
With man who sold the world
PM   Вверх
nikos89
Дата 28.10.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я бы хотел уточнить на счет программы. Она у меня не запускается вообще, пишет "Неверная функция: (A C (E F))". Я может забыл уточнить я программу делаю в Visual LISP для AutoCAD(там может ф-ций каких то нет??).
PM MAIL   Вверх
newbee
Дата 28.10.2011, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



nikos89, попробуй 
Код

-(defun atom-adder (list)
+(defun atom-adder (inlist)
-  (adder list 1 nil nil)))
+  (adder inlist 1 nil nil)))

PS. Я на Common Lisp написала, автокадовский ни разу не видела.
PPS. Написала просто ради интереса, нравятся мне такие задачки, ты лучше свою версию исправь, я же показала, в какую сторону смотреть.


--------------------
You're face to face
With man who sold the world
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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