球拍(递归结构和处理模板)

问题描述 投票:0回答:1

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

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

我已经尝试了几个小时,但尚未解决。我不确定从这里出发,有人对球拍有敏锐的眼光吗?我已经尝试过先处理该主题,但是这样做还没有任何运气。

racket recursive-datastructures mutual-recursion list-processing
1个回答
0
投票

您不应该在解决方案中使用make-discussion,我们正在尝试遍历结构,而不是创建新结构。有两种情况需要考虑:

  • 如果digressions列表为空,那么我们找到了一个主题,没有别的地方可去。
  • 否则,我们计算一个主题(当前主题),然后对digressions列表中的所有元素进行递归,并添加其结果。使用applymap
  • 易于实现

这是我的意思:

(define (count-topics d)
  (cond
    [(empty? (discussion-digressions d)) 1]
    [else (add1 (apply + (map count-topics (discussion-digressions d))))]))

当然,您可以在不使用applymap的情况下解决此问题,但是最好像Alex所建议的那样编写单独的过程。无论如何,我的方法按预期工作:

(count-topics
 (make-discussion "music"
                  (list (make-discussion "politics" empty))))
=> 2
© www.soinside.com 2019 - 2024. All rights reserved.