Рассмотрим следующий BNF, определяющий деревья чисел.
Обратите внимание, что дерево может быть либо листом, либо узлом 1 с одним поддеревом, либо узлом 2
с двумя поддеревьями.
tree ::= (’leaf number)
| (’node-1 tree)
| (’node-2 tree tree)
а. Напишите шаблон для рекурсивных процедур на этих деревьях.
б. Определите процедуру (счетчик листьев t), которая возвращает
количество листьев в т
> (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))
Я получаю следующее сообщение об ошибке:
car: ожидает аргумент типа пары; данный лист
Что означает это сообщение об ошибке? Я определяю лист как список. Но по какой-то причине он этого не видит и выдает мне это сообщение об ошибке.