Доброго времени суток!
Мне срочно необходима помощь по корректировке моего кода.
Формулировка задания следующая:
Заданы глубина подсписка, позиция и атом.
Включить во все имеющиеся подсписки заданной глубины на заданную позицию атом.
Ниже прикладывыется код, в последней стрчке - комментарий, как я вызываю эту функцию.
Параметры произвольные.
Первое приложение - это мой код с циклами, который работает некорректно, а именно он заходит не во все подсписки и как-то криво конкотенирует атомы и списки.
Не могу разобраться почему.
Времени мало - началась сессия, а допуск до экзамена не удается получить.
Код
(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))
А также, пожалуйста, помогите с реализацией этой же задачи, но с другой формулировкой, а именно:
Написать систему функций для этого задания, если исходные данные заданы массивом(возможно масссивом списков) вместо списка.
Искренне благодарен тем, кто сможет уделить своё время на решение моей проблемы.
Большое и человеческое спасибо.
С уважением к Вашим знаниям, Сергеев Александр.