Это началось как неправильное толкование упражнения 2.29 в SICP и стало личным любопытством. Кажется достаточно простым, я чувствую себя смущенным. У меня возникают проблемы с поиском решения, которое работает для всех случаев. Очевидно, я знаю, как подсчитывать узлы на дереве и как перечислять значения в каждом узле в один список, но ни один из алгоритмов не помогает мне фильтровать один и тот же индекс в каждом узле.Фильтрация для одного и того же индекса на всех узлах двоичного дерева в схеме?
Дано любое двоичное дерево, представленное как вложенный список, где каждый узел содержит одно или два целых числа, должна быть одна функция, которая возвращает список первого значения в каждом узле и тот, который возвращает второе значение в каждом узле (имея в виду, что не все узлы будут иметь второе значение).
Вот что я до сих пор с помощью простого теста:
(define (first-values tree)
(cond ((null? tree) '())
((not (pair? tree)) (list tree))
(else (cons (car (first-values (car tree)))
(first-values (car (cdr tree)))))))
(define (second-values tree)
(cond ((null? tree) '())
((not (pair? tree)) (list tree))
(else (cons (cdr (second-values (car tree)))
(second-values (car (cdr tree)))))))
(define (make-tree left right)
(list left right))
(define test (make-tree
(make-tree 2 5)
(make-tree (make-tree 4 10) (make-tree 6 20))))
test
(first-values test)
(second-values test)
И результат:
((2 5) ((4 10) (6 20)))
(2 4 6 20)
((5) (10)() 20)
Как вы можете видеть, первая функция не будет фильтровать значения в подсписков и второй лист посторонних подписок мне нужно будет отфильтровать с помощью функции перечисления. Я действительно пробовал все вариации автомобиля и cdr, о которых я мог думать, и это было самое близкое, что я пришел. Это ясно показывает, что я до сих пор не полностью понимаю работу со структурой списка, хотя это не было проблемой с более простыми примерами.
(Для справки я использую R5RS)
Я никогда не думал замените базовый корпус! Плюс теперь итерация точно такая же, как функция, которая перечисляет все значения узлов, а не все искаженные, как то, что у меня получилось. Спасибо :) –
@Sophia 9 из 10 раз, трюк состоит в том, чтобы 1) изменить базовый корпус и/или 2) изменить способ комбинирования рекурсивных вызовов ;-) –