【问题标题】:Searching within nested list Scheme/Racket在嵌套列表 Scheme/Racket 中搜索
【发布时间】:2016-11-04 07:50:38
【问题描述】:
(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))))

这是一棵通用树,比如说我定义了一个函数

(define (find-name name school)) ;;produces true if found/false if not.

如何进行递归?这个具体情况很好,但是每个孩子可以有无限个孩子吗?我只是需要一个提示

【问题讨论】:

  • 如果你正在搜索你检查当前节点是否是你的答案,否则你检查每个子节点是否使用递归,当没有节点离开并且没有找到时你返回一个错误或其他东西来指示失败。 Ps:对于无限的孩子​​递归不会有帮助,所以不能那样。如果您指的是循环,那么您需要一个结构来了解访问过的节点。

标签: scheme racket


【解决方案1】:

孩子的数量是有限的。
数量是任意的,仅受您机器内存的限制,但不能无限。

(而且您的 s-chart 格式不正确,因为“Claire”的孩子不在列表中。)

递归可以很简单。
这是深度优先搜索:

(define (find-name name school)
    (or (string=? name (school-name school))
        (any (lambda (s) (find-name name s)) (school-students school))))  

其中(any p ls)#t 当且仅当(p e)#t 对于列表e 的至少一个元素e

现在剩下的就是写any...

【讨论】:

    【解决方案2】:

    以下递归检查所有项目,如果找到,则将名称添加到循环外的列表中。但是,它需要使用set!。它使用string-prefix? 而不是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)
    

    输出:

    '("Timmy" "Travis" "Tom")
    

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 1970-01-01
      • 2013-11-26
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多