Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите пожалуйста с корректировкой моего кода  (Прочитано 6168 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
AlexSerg
Гость
« : 04-06-2007 21:35 » 

Доброго времени суток!
Мне срочно необходима помощь по корректировке моего кода.
Формулировка задания следующая:
Заданы глубина подсписка, позиция и атом.
Включить во все имеющиеся подсписки заданной глубины на заданную позицию атом.

Ниже прикладывыется код, в последней стрчке - комментарий, как я вызываю эту функцию.
Параметры произвольные.

Первое приложение - это мой код с циклами, который работает некорректно, а именно он заходит не во все подсписки и как-то криво конкотенирует атомы и списки.
Не могу разобраться почему.
Времени мало - началась сессия, а допуск до экзамена не удается получить.

Код

Код:
(defun Insert (poz X L)
(do ((n 1 (1+ n)) (ret) (tmp (car L)) (tmp1 (cdr L)))
  ((= n (1+ (length L))) ret)
  (cond
   ((ZEROP poz) (setq ret (cons X L)))
   ((= n poz) (setq ret (cons tmp (cons X tmp1))))
   (T (setq tmp (list tmp (car tmp1))) (setq tmp1 (cdr tmp1)))
  )
)
)

(defun Vstavlyalka (dpth poz X L)
(do ((n 0 (1+ n)) (ret) (tmp (cdr L)) (tmp_list_b (car L)))
  ((= n (length L)) ret)
  (cond
   ((ZEROP dpth) (setq ret (Insert poz X L)))
   ((ATOM (car tmp)) (setq tmp_list_b (list tmp_list_b (car tmp))) (setq tmp (cdr tmp)) )
   (T (setq dpth (1- dpth)) (setq ret (list tmp_list_b (Insert poz X (car tmp)) (cdr tmp))))
  )
)
)

;(Vstavlyalka 0 0 'X '(A B C D (1 2 3) E F G (1 2 3)))

Этот код той же задачи, но выполненный с помощью рекурсии. Это мне удалось сделать.
Код
Код:
(defun Insert(poz X L K)
(cond
   ((NULL L) L)
   ((ZEROP poz) (cons X L))
   ((= K (1- poz)) (cons (car L) (cons X (cdr L))))
   (t (Cons (car L) (Insert poz X (cdr L) (1+ K))))
)
)


(defun Func(dpth poz X L)
(cond
  ((NULL L) L)
  ((ZEROP dpth) (Insert poz X L 0))
  ((ATOM (car L)) (cons (car L) (Func dpth poz X (cdr L))))
  (t (cons (Func (1- dpth) poz X (car L)) (Func dpth poz X (cdr L))))

)
)


;(Func 2 2 'CC '(A B C (1 2 3 (AA BB DD EE) 4 (AA BB DD EE) 5) D E (AA BB DD EE) F))

А также, пожалуйста, помогите с реализацией этой же задачи, но с другой формулировкой, а именно:
Написать систему функций для этого задания, если исходные данные заданы массивом(возможно масссивом списков) вместо списка.


Искренне благодарен тем, кто сможет уделить своё время на решение моей проблемы.
Большое и человеческое спасибо.

С уважением к Вашим знаниям, Сергеев Александр.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 05-06-2007 03:19 » 

а на каком языке и в какой среде пишешь ?
Записан

AlexSerg
Гость
« Ответ #2 : 05-06-2007 07:16 » new

Common LISP в LispWorks

Мне помогли написать, вот что получилось
Код:
(defun ins (pos item list)
  (if (zerop pos)
      (cons item list)
      (do ((i 1 (1+ i))
           (rest list (cdr rest)))
          ((or (null rest)
               (= i pos))
           (if rest
               (setf (cdr rest) (cons item (cdr rest))))
           list))))

(defun insert-to-tree (item tree n-level pos)
  (let ((top '())
        (depth 0)
        (level tree))
    (loop
       (cond ((atom level)
              (if (null top)
                  (return-from insert-to-tree tree)
                  (psetq top (cdr top)
                         depth (1- depth)
                         level (car top))))
             ((= depth (1- n-level))
              (do ((rest level (cdr rest)))
                  ((null rest))
                (unless (atom (car rest))
                  (setf (car rest) (ins pos item (car rest)))))
              (setq level nil))
             (t
              (psetq top (cons (cdr level) top)
                     depth (1+ depth)
                     level (car level)))))))

CL-USER> (insert-to-tree 'x '(A B C (1 2 3 (AA BB DD EE) 4 (AA BB DD EE) 5) D E (AA BB DD EE) F) 1 0)
(A B C (X 1 2 3 (AA BB DD EE) 4 (AA BB DD EE) 5) D E (X AA BB DD EE) F)
CL-USER> (insert-to-tree 'x '(A B C (1 2 3 (AA BB DD EE) 4 (AA BB DD EE) 5) D E (AA BB DD EE) F) 2 0)
(A B C (1 2 3 (X AA BB DD EE) 4 (X AA BB DD EE) 5) D E (AA BB DD EE) F)
CL-USER> (insert-to-tree 'x '(A B C (1 2 3 (AA BB DD EE) 4 (AA BB DD EE) 5) D E (AA BB DD EE) F) 1 3)
(A B C (1 2 3 X (AA BB DD EE) 4 (AA BB DD EE) 5) D E (AA BB DD X EE) F)
CL-USER> (insert-to-tree 'x '(A B C (1 2 3 (AA BB DD EE) 4 (AA BB DD EE) 5) D E (AA BB DD EE) F) 2 3)
(A B C (1 2 3 (AA BB DD X EE) 4 (AA BB DD X EE) 5) D E (AA BB DD EE) F)

Теперь нужно реализовать эту же задачу, но с другой формулировкой, а именно:
Написать систему функций для этого задания, если исходные данные заданы массивом(возможно масссивом списков) вместо списка.[
Помогите пожалуйста переделат это с массивами./b]
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines