我在处理这个结构上遇到了困难,我想写一个函数来告诉讨论中出现了多少主题。
; 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)我已经试了几个小时了,还没有解出来。我不知道下一步该怎么做,有人对球拍有敏锐的眼力吗?我试着先处理这个主题,但没有任何运气这样做。
发布于 2020-05-09 05:59:05
你不应该在你的解决方案中使用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))))
=> 2https://stackoverflow.com/questions/61686433
复制相似问题