【问题标题】: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 内所有子列表的最大嵌套级别的列表。要找到最大值,需要apply 将max 应用于参数列表。由于子列表本身已经嵌套了一层,因此最大值加 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】:
这是我为这个问题提出的:
代码:
(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)))