Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка элемента в упорядоченный массив 
V
    Опции темы
Inkvizitor
Дата 24.12.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно итеративное решение.

Я написал код, но он почему-то криво работает. НЕ могу найти ошибку. Помогите исправить.

(defun vstavka (list1 list2)
    (do ((list3 nil)) ((null list2) list3)
        (cond 
            ((null list1)(print list1) (progn (setq list3 (append list3 list2)) (setq list2 nil)))
            ((null list2) (progn (setq list3 (append list3 list1)) (setq list1 nil)))
            ((< list1 (car list2)) (print list1) (progn (append list3 (cons list1 nil)) (print list3)(print list1) (setq list1 nil)))
            (t (progn (setq list3 (append list3 (cons (car list2) nil))) (setq list2 (cdr list2))))
        )
    )
)

(trace vstavka)
(vstavka 5 '(6 7))

PM MAIL   Вверх
svg
Дата 24.12.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

;; недеструктивный вариант
(defun vstavka1 (elt list &key (test #'<) (key #'identity))
  (labels ((do-vstavka (tail head)
             (if (or (not tail)
                     (funcall test elt (funcall key (car tail))))
                 (revappend head (cons elt tail))
                 (do-vstavka (cdr tail) (cons (car tail) head)))))
    (do-vstavka list nil)))

;; деструктивный вариант
(defun nvstavka1 (elt list &key (test #'<) (key #'identity))
  (let ((tail (member elt list :key key :test test)))
    (if tail
        (progn
          (rplacd tail (copy-list tail))
          (rplaca tail elt)
          list)
        (nconc list (list elt)))))


Это сообщение отредактировал(а) svg - 24.12.2006, 14:09
PM MAIL   Вверх
Inkvizitor
Дата 24.12.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я еще новичок. Вы могли бы объснить свой код, а то я в нем много не понимаю, или лучше скажите что в моем неправильно.
У меня ваш код не работает. Забыл сказать, что надо все сделать на XLISP.

(defun nvstavka1 (elt list &key (test #'<) (key #'identity))
  (let ((tail (member elt list :key key :test test)))
    (if tail
        (progn
          (rplacd tail (copy-list tail))
          (rplaca tail elt)
          list)
        (nconc list (list elt)))))

это выдает ошибку, пришлось убрать все агрументы по умолчанию. Запустил. Некорректно не работает. Например (nvstavka1 5 '(6 7)) возвращает (6 7 5).
В первом примере я вообще ничего не понимаю. ЧТо делает do-vstavka, labels?

Это сообщение отредактировал(а) Inkvizitor - 24.12.2006, 20:02
PM MAIL   Вверх
Inkvizitor
Дата 24.12.2006, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо за внимание. Я нашел ошибку. Тему можно удалять.
PM MAIL   Вверх
_sg
Дата 24.4.2014, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

(defun squeeze-in (n w)
  (let ((e))
    (loop for i from 0 below (length w) do
          ((lambda (u)
             (when  (and  (<= n u) (or (= i 0) (> n (nth (1- i) w))))
               (push n e))
             (push u e)
             (when (and (> n u) (= (length w) (1+ i)))
               (push n e)))
           (nth i w)))
    (nreverse e)))

> (squeeze-in 7 '(1 3 5 8 11))
(1 3 5 7 8 11)

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

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

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


 




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


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

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