Понеже не довършихме всички задачи, тук прилагам цялостно решение на недовършената. Хубавото е, че идеята беше обсъдена в час.

Да се напише деструктивна функция (filter! pred? l), която премахва от даден списък всички елементи, които не удовлетворяват даден предикат. Списъкът започва с фиктивен елемент.

(define (filter! pred? l)
  (cond ((null? (cdr l)) l) ;ако списъкът е само с един елемент, не правим нищо (може този елемент да е фиктивният, може и да не е - няма значение)
    ((pred? (cadr l)) (begin
        (filter! pred? (cdr l)) ;ако _следващият_ елемент удовлетворява предиката, продължаваме напред и връщаме l
        l))
    (else (begin
        (set-cdr! l (cddr l)) ;ако _следващият_ елемент не удовлетворява предиката, променяме текущата двойка да "сочи" по-следващия елемент - така го изтриваме
        (filter! pred? l) ;след това продължаваме напред
        l))))

;следват тестови примери
(filter! odd? '("list"))
(filter! odd? '("list" 1))
(filter! odd? '("list" 2))
(filter! odd? '("list" 1 2))
(filter! odd? '("list" 2 1))
(filter! odd? '("list" 1 2 3 4 5))

(define example '("list" 11 12 13 14 15))
(filter! even? example)
example
Последно модифициране: събота, 12 ноември 2011, 17:38