Scheme 在嵌套列表方案/框架内搜索
我有一张学校图表Scheme 在嵌套列表方案/框架内搜索,scheme,racket,Scheme,Racket,我有一张学校图表 (define-struct school (name students)) ;; An SchoolChart is a (make-school Str (listof SchoolChart)) ;; names are unique 这是一个普通的树,比如我定义了一个函数 (define s-chart (make-school "Tom" (list (make-school "James" empty) (make-school "Claire" (
(define-struct school (name students))
;; An SchoolChart is a (make-school Str (listof SchoolChart))
;; names are unique
这是一个普通的树,比如我定义了一个函数
(define s-chart (make-school "Tom" (list
(make-school "James" empty)
(make-school "Claire"
(make-school "David" empty)
(make-school "Travis" empty))
(make-school "Timmy" empty))))
我如何进行递归呢?这个特殊的例子很好,但是每个孩子可以有无限多个孩子?我只需要一个提示孩子的数量有限。
数量是任意的,只受计算机内存的限制,但不能是无限的 (你的
s-chart
格式不正确,因为“Claire”的孩子不在列表中。)
递归可以非常简单。以下是深度优先搜索:
(define (find-name name school)) ;;produces true if found/false if not.
其中(任意pls)
为#t
当且仅当(pe)
为#t
列表中至少一个元素e
现在剩下的就是写
any
…以下递归检查所有项目,如果找到,将名称添加到循环外的列表中。但是,它需要使用set代码>。它使用string前缀?
而不是string=?
进行演示(以获取当前结构中的更多名称):
输出:
(define-struct school (name students))
(define s-chart
(make-school "Tom"
(list
(make-school "James" empty)
(make-school "Claire" (list
(make-school "David" empty)
(make-school "Travis" empty)))
(make-school "Timmy" empty))))
(define (find-name name school)
(define ol '())
(let loop ((s school))
(cond
[(list? s)
(when (not(empty? s))
(begin (loop (first s))
(loop (rest s))))]
[else
(when (string-prefix? (school-name s) name)
(set! ol (cons (school-name s) ol)))
(loop (school-students s))
]))
ol
)
(find-name "T" s-chart)
如果您正在搜索,则检查当前节点是否是您的答案,否则使用递归检查每个子节点是否都是正确的,当没有节点剩余且未找到任何内容时,您将返回false或指示失败的内容。Ps:对于无限子对象,递归没有帮助,所以它不可能是这样。如果您指的是循环,那么您需要一个结构来了解访问的节点。
(define-struct school (name students))
(define s-chart
(make-school "Tom"
(list
(make-school "James" empty)
(make-school "Claire" (list
(make-school "David" empty)
(make-school "Travis" empty)))
(make-school "Timmy" empty))))
(define (find-name name school)
(define ol '())
(let loop ((s school))
(cond
[(list? s)
(when (not(empty? s))
(begin (loop (first s))
(loop (rest s))))]
[else
(when (string-prefix? (school-name s) name)
(set! ol (cons (school-name s) ol)))
(loop (school-students s))
]))
ol
)
(find-name "T" s-chart)
'("Timmy" "Travis" "Tom")