Конструирующая
рекурсия.
Задание 11: Сформировать список простых
множителей заданного числа. Запускать (LMul ...).
(defun Simple( M TList)
(cond ((Null TList) T)
((= 0 (rem M (car TList))) Nil)
(T (Simple M (cdr TList)))
)
)
(defun RunLMul (N M Temp)
(if (= 2 M) (Setq Temp Nil) (SetQ Temp (RunLMul N (- M 1))))
(cond ((and (= 0 (rem N M)) (Simple M Temp)) (cons M Temp ) )
(T Temp)
)
)
(defun LMul (N)
(cond ((or (not (IntegerP N))(not ( PlusP N))) 'non-integer)
((= N 1) Nil)
(T (RunLMul N N))
)
)
(rds)
-----------------------------------------------------------------
Задание 12: Реверсировать элементы
списка произвольной структуры на всех уровнях. Запускать (RevL ...).
(defun GoRev (L)
(cond ((Null L) Nil)
( (ListP (car l)) (cons (RunRevL (car L)) (GoRev (cdr L))) )
( T (cons (car L) (GoRev (cdr L))) )
)
)
(defun RunRevL (L)
(setq l(GoRev L))
(setq l (reverse L))
)
(defun RevL (L)
(cond ((Not (ListP L)) 'non-list)
((Null L) 'nil)
(T (RunRevL L))
)
)
(RDS)
-----------------------------------------------------------------
Задание 13: Линеаризовать список
произвольной структуры. Запускать (LinL ...).
(defun RunLinL (L)
(cond ( (Null L) nil)
( (ListP (car L)) (append (RunLinL (car l)) (RunLinL (cdr L))))
( T (cons (car l) (RunLinL (cdr L))))
)
)
(defun LinL (L)
(cond ( (not(ListP L)) 'non-list )
( (Null L) nil)
( T (RunLinL L))
)
)
----------------------------------------------------------------
Задание 14: Сформировать список,
являющийся пересечением двух заданных линейных списков. Повторяющиеся
в исзодных списках элементы должны входить в итоговый список не более
одного раза. Запускать (Cross ....).
(defun RunCross (L M Temp)
(cond ((Null M) Temp)
( (and (Member (car M) L)
(not (Member (car M) Temp))
)
(setq Temp (cons (car M) Temp))
(setq Temp (RunCross L (cdr M) Temp))
)
(T (setq Temp (RunCross L (cdr M) Temp)))
)
)
(defun Cross (L M)
(cond ((Not (ListP L)) 'non-list-1 )
((Not (ListP M)) 'non-list-2 )
((Null L) nil)
((Null M) nil)
(T (RunCross L M))
)
)
-------------------------------------------------------------------
Задание 15: Сформировать список чисел
ряда Фибоначчи от первого числа до числа с заданным номерои включительно.
Запускать (FiboL ....).
(defun RunFiboL (M N prev temp)
(setq temp (+ (car prev) (cdr prev)))
(if (< M N) (cons temp
(RunFiboL (+ M 1)
N
(cons temp (car prev))
)
)
(list temp)
)
)
(defun FiboL (N)
(cond ((not (numberp n)) 'non-number!!)
((<= n 0) 'non-positive!!)
((eq n 1) '(1))
((eq n 2) '(1 2))
(T (cons 1 (cons 2 (RunFiboL 3 N '(2 . 1) ))))
)
)
(rds)
©Bear
Labs, Inc. 2001, All Rights Reserved.