Для меня сработало следующее:
(define (deep-reverse tree)
(define (deep-reverse-iter items acc)
(cond
((null? items) acc)
((not (pair? items)) items)
(else (deep-reverse-iter
(cdr items)
(cons (deep-reverse (car items)) acc)))))
(deep-reverse-iter tree ()))
(define x (list (list 1 2) (list 3 4 (list 5 6))))
(newline)
(display (deep-reverse x))
Он печатает (((6 5) 4 3) (2 1))
как положено и использует минимум стандартных функций библиотеки: pair?
, чтобы проверить, является ли дерево cons
и null?
для проверки пустого дерева / списка.
Это решение для деревьев является обобщением функции reverse
для списков:
(define (reverse items)
(define (reverse-iter items acc)
(cond
((null? items) acc)
((not (pair? items)) items)
(else (reverse-iter (cdr items) (cons (car items) acc)))))
(reverse-iter items ()))
разница в том, что deep-reverse
такжеприменяется к car items