我很想处理这种结构,我想编写一个函数来告诉您讨论中出现了多少个主题。
; a Discussion is (make-discussion String Digressions)
(define-struct discussion [topic digressions])
; Digressions is [ListOf Discussion]
; count-topics : Discussion -> Number
; counts the number of total topics in a discussion, including repeated topics
(define (count-topics d)
(cond
[(empty? (discussion-digressions d)) 0]
[(cons? (discussion-digressions d)) (add1 (count-topics (make-discussion (first (discussion-topic d))
(list (make-discussion (rest (discussion-digressions d)))))))]))
(check-expect (count-topics (make-discussion "music" (list (make-discussion "politics" empty)))) 2)
我已经尝试了几个小时,但尚未解决。我不确定从这里出发,有人对球拍有敏锐的眼光吗?我已经尝试过先处理该主题,但是这样做还没有任何运气。
您不应该在解决方案中使用make-discussion
,我们正在尝试遍历结构,而不是创建新结构。有两种情况需要考虑:
digressions
列表为空,那么我们找到了一个主题,没有别的地方可去。digressions
列表中的所有元素进行递归,并添加其结果。使用apply
和map
这是我的意思:
(define (count-topics d)
(cond
[(empty? (discussion-digressions d)) 1]
[else (add1 (apply + (map count-topics (discussion-digressions d))))]))
当然,您可以在不使用apply
和map
的情况下解决此问题,但是最好像Alex所建议的那样编写单独的过程。无论如何,我的方法按预期工作:
(count-topics
(make-discussion "music"
(list (make-discussion "politics" empty))))
=> 2