Tree 球拍树深度函数(树递归)(无结构节点!)

Tree 球拍树深度函数(树递归)(无结构节点!),tree,scheme,racket,depth,Tree,Scheme,Racket,Depth,我正在尝试编写一个过程(深度树),它将树作为输入并返回一个整数 使用Racket/Scheme指示树的最大级别 例如: (depth '()) => 0 (depth '(1 2 3)) => 1 (depth '(a (b (c (d))))) => 4 (depth '((((((0))))))) => 6 我不能用结构来做这件事,所以这对我来说是一项复杂得多的任务。 我尝试过使用car/cdr递归+来实现这一点,但我不能完全正确地实现它。 任何建议都将不胜感激。以

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

例如:

(depth '()) => 0
(depth '(1 2 3)) => 1
(depth '(a (b (c (d))))) => 4
(depth '((((((0))))))) => 6
我不能用结构来做这件事,所以这对我来说是一项复杂得多的任务。 我尝试过使用car/cdr递归+来实现这一点,但我不能完全正确地实现它。
任何建议都将不胜感激。

以下是我针对这个问题提出的建议:

  • 如果输入不是空列表,那么使用
    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)))

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

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

#lang racket

(define (max-depth xss)
  (if (pair? xss)
      (+ 1 (apply max (map max-depth xss)))
      0))
这里,
(map max depth xss)
计算为
xss
中所有子列表的最大嵌套级别列表。要找到最大值,需要对参数列表应用
max
。由于子列表本身已经嵌套了一层深,因此将1添加到最大值

最大深度.rkt>(最大深度'x)
0
最大深度.rkt>(最大深度“())
0
最大深度rkt>(最大深度’(1 2 3))
1.
最大深度.rkt>(最大深度’(a(b(c(d)(()())))
4.
max depth.rkt>(最大深度“(((((((((((0))))))))))
6.
最大深度rkt>(最大深度’(ab(cd(ef(g))h)(ij)(k(l(m(n(o)p)))q)r))
6.

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