Добавить число в упорядоченный в порядке возрастания список -
07.04.2007, 20:44
Всем здрасти.
Помогите с программой, а то что-т никак не врублюсь:
Добавить число в упорядоченный в порядке возрастания список без нарушения порядка.
Например: >(функция 7 ‘(1 3 5 8 11)) результат: (1 3 5 7 8 11). Никак не дойдет какая функция ето делает ((
Желательно задачу решить двумя способами: рекурсивно и с помощью организации циклов.
(defun plunge-in (n w)
(when w ((lambda (a d)
(if (atom d)
(list a n)
(if (<= n a)
(cons n w)
(cons a (plunge-in n d)))))
(car w) (cdr w))))
(plunge-in 7 '(1 3 5 8 11)) (1 3 5 7 8 11)
Код:
(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)))
(defun plug-in (x list)
(loop for (y . rest) on list
when (< x y)
nconc (list* x y rest) into head
and return head
collect y into head
finally (return (nconc head (list x)))))
(defun plug-in (x list)
(loop for (y . rest) on list
when (< x y)
nconc (list* x y rest) into head
and return head
collect y into head
finally (return (nconc head (list x)))))
Вряд ли SORT будет учитывать, что список уже отсортирован.
Код:
(defun cram-in (n w)
(merge 'list (list n) w #'<))
Спасибо.
Возможно, что lambda разгружает верхнюю часть кода и не нарушает функционального стиля,
хотя согласен с Вами, что let* и let имеют свои преимущества (в том числе - слитность) и чаще
применяются.
Возможно ли ету программу разработать в итерационном варианте ? Тоесть что бы в функции использовались лишь приметивы car, cdr и cons, а все остальные должны должны быть определыны через эти приметивы.
Итерация - это концевая рекурсия? Тогда можно. Но, чтобы Вам не было совсем скучно, я не стал описывать, как выразить > и COND через примитивы CONS, CAR и CDR - надеюсь, с этим проблем не возникнет.
2 Alexey Dejneka
А можно чуть по подробней, у меня впринципи и вызвало затруднее, то как выразить cond через приметивы. В принципи так то понятно, но вот что то не получается.
Заранее спасибо.