Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Вставка элемента в упорядоченный массив


Автор: Inkvizitor 24.12.2006, 13:05
Нужно итеративное решение.

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

(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))

Автор: svg 24.12.2006, 14:06
Код

;; недеструктивный вариант
(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)))))

Автор: Inkvizitor 24.12.2006, 19:32
Я еще новичок. Вы могли бы объснить свой код, а то я в нем много не понимаю, или лучше скажите что в моем неправильно.
У меня ваш код не работает. Забыл сказать, что надо все сделать на 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:34
Всем спасибо за внимание. Я нашел ошибку. Тему можно удалять.

Автор: _sg 24.4.2014, 20:14
как вариант:
Код

(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)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)