首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球拍(递归结构和处理模板)

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

Stack Overflow用户
提问于 2020-05-09 03:13:33
回答 1查看 205关注 0票数 0

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

代码语言:javascript
复制
; 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)

我已经试了几个小时了,还没有解出来。我不知道下一步该怎么做,有人对球拍有敏锐的眼力吗?我试着先处理这个主题,但没有任何运气这样做。

EN

回答 1

Stack Overflow用户

发布于 2020-05-09 05:59:05

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

  • 如果digressions列表是空的,那么我们已经找到了一个主题,并且没有其他地方可去。
  • 否则,我们计算一个主题(当前的主题),并对digressions列表中的所有元素调用递归,将它们的结果相加。使用applymap

很容易实现这一点

这就是我的意思:

代码语言:javascript
复制
(define (count-topics d)
  (cond
    [(empty? (discussion-digressions d)) 1]
    [else (add1 (apply + (map count-topics (discussion-digressions d))))]))

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

代码语言:javascript
复制
(count-topics
 (make-discussion "music"
                  (list (make-discussion "politics" empty))))
=> 2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61686433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档