2014-11-12 2 views
0

가계도와 사람에 대해 두 가지 정의가 있습니다.라켓에서의 상호 재귀, 두 가지 일을하는 조건

; 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을 호출 한 결과입니다. 함수의 또 다른 오류는 person-childrenfirstrest을 사용하지만 함수가 사람 목록을 처리하도록 설계되지 않았기 때문입니다. 비어있는 상태에서 호출하면 person-children을 비울 수 없으므로 오류가 발생합니다. 마지막으로, 사람이 아이를 갖지 않는 경우, 나는 그것이 여전히 계산되어야한다고 생각하기 때문에, 나는 그 경우에 1을 반환합니다. 나는 PERSON1의 모든 아이들의 후손을 계산하는 map을 사용하여 여기에서

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

, 그리고 foldl는 결과를 추가 : 그래서 모든이를 추가,이 같은 결과가 발생해야합니다.

+0

대단히 감사합니다! 카운트 - 후손이 단지리스트를 취하기 때문에 마지막 "person1"은 (person-children person1) 일 필요가 있습니다. – Acoustic77

+0

죄송합니다. 그것을 지적 주셔서 감사합니다. 이제 해결되었습니다. 다행스럽게 도울 수있어! – Rptx