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