【问题标题】:Racket Tree Depth function (tree recursion) (No Structure Nodes!)球拍树深度函数(树递归)(无结构节点!)
【发布时间】:2021-08-03 14:34:26
【问题描述】:

我正在尝试编写一个将树作为输入并返回整数的过程(深度树) 使用 Racket/Scheme 指示树的最大级别

例子:

(depth '()) => 0
(depth '(1 2 3)) => 1
(depth '(a (b (c (d))))) => 4
(depth '((((((0))))))) => 6

我不能使用结构来执行此操作,因此这对我来说是一项复杂得多的任务。 我尝试过使用 car/cdr recursion + 并做到这一点,但我不能完全正确。 任何建议将不胜感激。

【问题讨论】:

  • 分享您的尝试和遇到的具体错误会很有帮助。

标签: tree scheme racket depth


【解决方案1】:

输入是一个原子或一对;如果输入是一对,那么它可能包含原子或更多对。当输入是一对时,您应该在子对的最大嵌套级别上加 1。否则输入不是一对,最大嵌套级别为 0。注意在 Racket 中,'() 不是pair?

这些观察得出一个非常简单的定义:

#lang racket

(define (max-depth xss)
  (if (pair? xss)
      (+ 1 (apply max (map max-depth xss)))
      0))

这里,(map max-depth xss) 计算为xss 内所有子列表的最大嵌套级别的列表。要找到最大值,需要applymax 应用于参数列表。由于子列表本身已经嵌套了一层,因此最大值加 1。

max-depth.rkt> (max-depth 'x)
0
max-depth.rkt> (max-depth '())
0
max-depth.rkt> (max-depth '(1 2 3))
1
max-depth.rkt> (max-depth '(a (b (c (d)))))
4
max-depth.rkt> (max-depth '((((((0)))))))
6
max-depth.rkt> (max-depth '(a b (c d (e f (g)) h) (i j) (k (l (m (n (o) p))) q) r))
6

【讨论】:

    【解决方案2】:

    这是我为这个问题提出的:

    • 如果输入不是空列表,那么使用map,我们可以(递归地)检查列表中每个元素的最大递归深度,并从列表中选择 map输出,递归最大深度最大的元素,加1。

    • 如果输入为空列表,则返回 0。

    代码:

    (define (depth tree)
      (if (null? tree)
          0
          (max-items (map (lambda (x)
                            (cond ((not (pair? x)) 1)
                                  (else (+ 1 (depth x))))) tree))))
    
    (define (max-items items)
      (define (iter lst cur-max)
        (cond ((null? lst) cur-max)
              ((> (car lst) cur-max) (iter (cdr lst) (car lst)))
              (else (iter (cdr lst) cur-max))))
     (iter (cdr items) (car items)))
    

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 2017-03-24
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多