Напишите процедуру fringe, которая упорядочивает деревья - Lisp
Формулировка задачи:
Напишите процедуру fringe, которая берет в качестве аргумента дерево (представленное в виде списка) и возвращает список, элементы которого — все листья дерева, упорядоченные слева
направо. Например,
Помогите справиться с задачей, используя только append, map, cons, list (т.е. без foldr, apply, которые описаны здесь: https://www.linux.org.ru/forum/development/1289170, мы их ещё не проходили )
Я попытался сделать, но у меня вышло не совсем то, что надо:
(define x (list (list 1 2) (list 3 4))) (fringe x) (1 2 3 4) (fringe (list x x)) (1 2 3 4 1 2 3 4)
#lang racket
(define (fringe tree)
(cond ((not (pair? tree)) tree)
((null? tree) tree)
((null? (car tree)) (cdr tree))
;((null? (cdr tree)) (car tree))
(else (cons (fringe (car tree)) (fringe (cdr tree))))))
(define x (list (list 1 2) (list 3 4)))
(fringe x)Решение задачи: «Напишите процедуру fringe, которая упорядочивает деревья»
textual
Листинг программы
(defun tree-to-list (tree) (cond ((null tree) nil) ((atom tree) (list tree)) (t (append (tree-to-list (car tree)) (tree-to-list (cadr tree)))))) ==> TREE-TO-LIST (setf *tree* (list (list 1 2) (list 3 4))) ==> ((1 2) (3 4)) (tree-to-list *tree*) ==> (1 2 3 4) (tree-to-list (list *tree* *tree*)) ==> (1 2 3 4 1 2 3 4)
Объяснение кода листинга программы
В данном коде реализована функция tree-to-list, которая принимает в качестве аргумента дерево и возвращает упорядоченный список.
Вот что делает этот код:
- Если дерево пустое, то возвращается
nil. - Если дерево является атомом (листом), то возвращается список, содержащий этот атом.
- Если дерево имеет более одного элемента, то рекурсивно вызывается функция
tree-to-listдля его корня и двух верхних ветвей, и возвращается результат их применения, объединённый с помощью операцииappend. Сначала вычисляется значение переменной*tree*, которая содержит список с двумя элементами:(1 2)и(3 4). Затем функцияtree-to-listприменяется к этому значению: - Первый вызов функции
tree-to-listс аргументом(1 2)возвращает(1 2). - Второй вызов функции
tree-to-listс аргументом(3 4)возвращает(3 4). - Третий вызов функции
tree-to-listс аргументом(1 2)возвращает(1 2). - Четвёртый вызов функции
tree-to-listс аргументом(3 4)возвращает(3 4). Результат этих вызовов объединяется с помощью операцииappendи возвращается как результат выполнения функцииtree-to-listдля исходного значения*tree*. Таким образом, результатом будет упорядоченный список(1 2 3 4). Затем функцияtree-to-listприменяется к результату предыдущего вызова, который содержит уже упорядоченный список(1 2 3 4). Поскольку дерево больше не содержит листьев, будет выполнен третий пункт условия: рекурсивный вызов функцииtree-to-listдля корня и двух верхних ветвей. В данном случае это будет(1 2)и(3 4). Их объединение даст(1 2 3 4 1 2 3 4). Таким образом, результатом выполнения кода будет упорядоченный список(1 2 3 4 1 2 3 4).