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 做不止一件事。

IE:

(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*/]))

知道如何递归调用列表其他部分的函数并添加一个吗?

4

1 回答 1

1

你所问的都是用begin表情来完成的。但你在这里不需要。您需要结合 2 个递归调用的结果。在您的情况下,您需要在调用count-descendants每个孩子的结果中添加 1(当前人)。您的函数中的另一个错误是您使用 firstand restperson-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结果相加。

于 2014-11-12T22:14:04.497 回答