racket - 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)
我已经尝试了几个小时,但还没有解决它。我不知道从哪里开始,有人对球拍有敏锐的眼光吗?我试图先处理这个话题,但没有任何运气这样做。
解决方案
您不应该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
and的情况下解决此问题map
,但为此最好按照 Alex 的建议编写单独的程序。无论如何,我的方法按预期工作:
(count-topics
(make-discussion "music"
(list (make-discussion "politics" empty))))
=> 2
推荐阅读
- php - CodeIgniter:如何使用活动记录将一个列值移动到另一个具有 Where 条件的值
- excel - 如何将 HLookup 结果与“”进行比较?
- python - 如何在 Python 中实现连接权重产品模型可解释性方法?
- flutter - Flutter:编写 _InternalLinkedHashMap
到 Rx - node.js - 如何使用 Jest 在 Nodejs 中对 uncaughtException 和 unhandledRejection 进行单元测试
- python - 具有指定类的 ul 上的美丽汤 find_all 不返回任何指定类。Find_all 适用于同一程序中的不同 ul
- python - 如何在 Django 中显示自连接字段?
- excel - 使用 VLOOKUP VBA 删除单元格值
- windows - 批量替换文件名中的字符
- python - 如何确认我的答案是否具有 O(1) 空间复杂度并修改数组?这是一个反向字符串 Leetcode 问题