2014-11-12 2 views
0

У меня есть два определения, для генеалогического древа и человека.Взаимная рекурсия в ракетке, что делает cond делать две вещи

; a family-tree is: 
; (make-person list-of-family-tree symbol number symbol) 
; a person is: 
; (define-struct person [children name date eyes]) 

мне нужно сделать «взаимно рекурсивных» функцию, которая подсчитывает количество потомков в дереве (включая человека). Но я не могу понять, как сделать cond делать больше, чем одно, если условие выполнено.

т.е .:

(define (count-descendants person1) 
    (cond [(empty? (person-children person1)) +0] 
     [else (count-descendants (first (person-children person1)))/*also +1 here*/ 
       (count-descendants (rest (person-children person1)))/*also +1 here*/])) 

Любая идея, как рекурсивный вызов функции на другие части списка, и добавить один?

ответ

1

То, что вы просите, выполняется с помощью выражения begin. Но вам здесь это не нужно. Вам необходимо: объединить результат двух рекурсивных вызовов. В вашем случае вам нужно добавить 1 (текущий человек) в результат звонка count-descendants на каждого ребенка. Еще одна ошибка в вашей функции заключается в том, что вы используете first и rest для person-children, но ваша функция не предназначена для обработки списка лиц. когда вы вызываете его пустым, вы получите сообщение об ошибке, потому что вы не можете получить person-children пустого. Наконец, в случае, если у человека нет детей, я считаю, что его все равно следует учитывать, поэтому я возвращаю 1 в этом случае. Поэтому добавление все это, вы должны в конечном итоге с чем-то вроде этого:

(define (count-descendants person1) 
    (cond [(empty? (person-children person1)) 1] 
     [else (+ 1 
       (foldl + 0 (map count-descendants (person-children person1))))])) 

здесь, я использую map сосчитать потомков всех детей Person1 и foldl сложить результат.

+0

Это большое спасибо! Просто обратите внимание, что последний «person1» должен быть (person-children person1), чтобы он работал, потому что потомки-потомки просто берут список – Acoustic77

+0

К сожалению. Спасибо, что указали это. Теперь это исправлено. Рад, что смог помочь! – Rptx

Смежные вопросы