首页 > 解决方案 > Racket(递归结构和处理模板)

问题描述

我很难处理这个结构,我想编写一个函数来告诉讨论中出现了多少主题。

; 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)

我已经尝试了几个小时,但还没有解决它。我不知道从哪里开始,有人对球拍有敏锐的眼光吗?我试图先处理这个话题,但没有任何运气这样做。

标签: racketrecursive-datastructuresmutual-recursionlist-processing

解决方案


您不应该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))))]))

当然,您可以在不使用applyand的情况下解决此问题map,但为此最好按照 Alex 的建议编写单独的程序。无论如何,我的方法按预期工作:

(count-topics
 (make-discussion "music"
                  (list (make-discussion "politics" empty))))
=> 2

推荐阅读