Так же, как заголовок говорит, что я хочу найти количество узлов, у которых есть один ребенок, и не могу понять, что не так с моим кодом:Схема - количество внутренних узлов двоичного дерева поиска, которые имеют ровно один ребенок
Вот как я определяю деревья
(define (make-tree v left-tree right-tree)
(list v left-tree right-tree))
(define (value T) (car T))
(define (left T) (cadr T))
(define (right T) (caddr T))
Код для нахождения числа узлов:
(define (count-one-child T)
(let* ((sum 0))
(cond ((null? T) 0)
((and (null? (left T))(null? (right T))) sum)
((and (null? (left T)) (not (null? (right T))))
(begin (set! sum (+ 1 sum)) (count-one-child (right T)) sum))
((and (null? (right T))(not (null? (left T))))
(begin (set! sum (+ 1 sum)) (count-one-child (left T)) sum))
(else (begin (count-one-child (left T)) (count-one-child (right T)))))))
Есть ли способ сказать, когда установлен! будет работать лучше? –
@ThisPlayName, когда вы абсолютно _have to_ mutate state и/или сохраняете состояние между вызовами процедуры, но большую часть времени вы хотите запрограммировать в функциональном стиле без апатии, который в значительной степени зависит от рекурсии (передачи измененных значений в качестве параметров) и использования встроенные функции, функции более высокого порядка и состав функций. –