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

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

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

Напишите процедуру fringe, которая берет в качестве аргумента дерево (представленное в виде списка) и возвращает список, элементы которого — все листья дерева, упорядоченные слева направо. Например,
Листинг программы
  1. (define x (list (list 1 2) (list 3 4)))
  2. (fringe x)
  3. (1 2 3 4)
  4. (fringe (list x x))
  5. (1 2 3 4 1 2 3 4)
Помогите справиться с задачей, используя только append, map, cons, list (т.е. без foldr, apply, которые описаны здесь: https://www.linux.org.ru/forum/development/1289170, мы их ещё не проходили ) Я попытался сделать, но у меня вышло не совсем то, что надо:
Листинг программы
  1. #lang racket
  2. (define (fringe tree)
  3. (cond ((not (pair? tree)) tree)
  4. ((null? tree) tree)
  5. ((null? (car tree)) (cdr tree))
  6. ;((null? (cdr tree)) (car tree))
  7. (else (cons (fringe (car tree)) (fringe (cdr tree))))))
  8.  
  9. (define x (list (list 1 2) (list 3 4)))
  10. (fringe x)

Решение задачи: «Напишите процедуру fringe, которая упорядочивает деревья»

textual
Листинг программы
  1. (defun tree-to-list (tree)
  2.   (cond ((null tree) nil)
  3.         ((atom tree) (list tree))
  4.         (t (append (tree-to-list (car tree)) (tree-to-list (cadr tree))))))
  5.  
  6. ==> TREE-TO-LIST
  7.  
  8. (setf *tree* (list (list 1 2) (list 3 4)))
  9.  
  10. ==> ((1 2) (3 4))
  11.  
  12. (tree-to-list *tree*)
  13.  
  14. ==> (1 2 3 4)
  15.  
  16. (tree-to-list (list *tree* *tree*))
  17.  
  18. ==> (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы