Напишите процедуру fringe, которая упорядочивает деревья - Lisp

Узнай цену своей работы

Формулировка задачи:

Напишите процедуру fringe, которая берет в качестве аргумента дерево (представленное в виде списка) и возвращает список, элементы которого — все листья дерева, упорядоченные слева направо. Например,
(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)
Помогите справиться с задачей, используя только append, map, cons, list (т.е. без foldr, apply, которые описаны здесь: https://www.linux.org.ru/forum/development/1289170, мы их ещё не проходили ) Я попытался сделать, но у меня вышло не совсем то, что надо:
#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, которая принимает в качестве аргумента дерево и возвращает упорядоченный список. Вот что делает этот код:

  1. Если дерево пустое, то возвращается nil.
  2. Если дерево является атомом (листом), то возвращается список, содержащий этот атом.
  3. Если дерево имеет более одного элемента, то рекурсивно вызывается функция tree-to-list для его корня и двух верхних ветвей, и возвращается результат их применения, объединённый с помощью операции append. Сначала вычисляется значение переменной *tree*, которая содержит список с двумя элементами: (1 2) и (3 4). Затем функция tree-to-list применяется к этому значению:
  4. Первый вызов функции tree-to-list с аргументом (1 2) возвращает (1 2).
  5. Второй вызов функции tree-to-list с аргументом (3 4) возвращает (3 4).
  6. Третий вызов функции tree-to-list с аргументом (1 2) возвращает (1 2).
  7. Четвёртый вызов функции 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).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы