Напишите процедуру 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д