Рассмотрим следующие BNF, определяющие деревья чисел. Обратите внимание, что дерево может быть либо листом, либо узлом-1 с одним поддеревом, либо узлом-2 с двумя поддеревьями.Двоичные деревья в схеме
tree ::= (’leaf number)
| (’node-1 tree)
| (’node-2 tree tree)
a. Напишите шаблон для рекурсивных процедур на этих деревьях.
b. Определите процедуру (лист подсчета т), который возвращает число листьев в т
> (leaf-count ’(leaf 5))
1
> (leaf-count ’(node-2 (leaf 25) (leaf 17)))
2
> (leaf-count ’(node-1
(node-2 (leaf 4)
(node-2 (leaf 2) (leaf 3)))))
3
Вот что я до сих пор:
;define what a leaf, node-1, and node-2 is
(define leaf list)
(define node-1 list)
(define node-2 list)
;procedure to decide if a list is a leaf or a node
(define (leaf? tree) (number? (car tree)))
(define (node? tree) (pair? (car tree)))
(define (leaf-count tree)
(cond ((null? tree) 0)
((number? tree) 0)
((leaf? tree) 1)
(else (+ (leaf-count (car tree))
(leaf-count (cdr tree))))))
Похоже, он должен работать нормально, но когда Я пытаюсь запустить его с помощью простого теста, как
(leaf-count '(leaf 5))
Я получаю следующее сообщение об ошибке:
автомобиль: ожидает аргумент типа пара; данный лист
Что означает это сообщение об ошибке? Я определяю лист как список. Но по какой-то причине он этого не видит и дает мне сообщение об ошибке.
Когда я прочитал ваш вопрос, я не знаю, как ответить, потому что я понятия не имею, что вы умеете делать. Вам нужно знать, как создавать структуры списков в схеме? Можете ли вы создать функцию, которая рекурсивно пересекает список? Слишком много неизвестных. – Davorak
У меня есть код, который пытается решить эту проблему (см. Выше). Можете ли вы просмотреть его и помочь мне исправить это? – Javier