Ваш код должен делать две отдельные вещи:
- Найдите ветку, содержащую n
- Подсчитайте количество братьев и сестер в этой ветви с учетом возможности начала других ветвей.
Поиск ветки, содержащей n, при условии, что n может появиться только один раз:
(define (find-branch root n)
(cond ((empty? root) empty)
((memq n root)
root)
((list? (first root))
(let ((subresult (find-branch (first root) n)))
(if (not (empty? subresult))
subresult
(find-branch (rest root) n))))
(else (find-branch (rest root) n))))
Поскольку вы используете «Начинающий студент», это лишает вас всех инструментов. К счастью, у него все еще есть number?
, поэтому, если можно с уверенностью предположить, что все, что не является числом в этом присвоении, является списком, вы можете определить list?
следующим образом:
(define (list? n) (not (number? n)))
Учитывая ваше дерево примеров в качестве входных данных, оно вернет:
(4 5 6)
В приведенном выше примере многократно используется memq
для rest
входного списка в результате использования рекурсии для итерации по одному и тому же списку.
Вот более эффективная версия вышеизложенного, но вы не можете реализовать ее в Beginning Student:
(define (find-branch root n)
(cond ((empty? root) false)
((memq n root) root)
(else (foldl (λ (a b)
(if (empty? a) b a))
empty
(map (λ (sublist)
(find-branch sublist n))
(filter list? root))))))
Вы передаете результат этой функции для подсчета братьев и сестер. Ранее я предоставил версию, которая будет работать в настоящей Racket, но не в версии для начинающих, используемой учителями:
(define (count-siblings root mem)
(count (λ (sib)
(and (not (eq? sib mem))
(not (list? sib)))) root))
Вот версия, совместимая с Beginning Student:
(define (count-siblings lst n counter)
(cond
[(empty? lst) counter]
[(and (not (list? (first lst)))
(not (eq? n (first lst))))
(count-siblings (rest lst) n (add1 counter))]
[else (count-siblings (rest lst) n counter)]))
Наконец, соедините их вместе:
(define (find/count-siblings root n)
(count-siblings (find-branch root n) n 0))
person
Throw Away Account
schedule
10.03.2015
member?
не существует в языке#!racket
. Естьmember
,memv
иmemq
. - person Sylwester   schedule 11.03.2015