我试图在方案中编写一个能够找到列表最大深度的程序。到目前为止我的代码是:
(define (depth l)
(define (helper l count)
( cond
((null? l) count)
((not(list? (car l))) (helper (cdr l) count))
(else (helper (car l) (+ count 1)) )
)
)
(helper l 1)
)
适用于此类型(depth '(1 2 3 (2))) -> 2
的列表,但显然不适用于(depth '( (2) ((3))) -> 3
类型的列表。问题是,当我第一次遇到一个列表时,我会自动跳转到它递增计数并再次递归调用它,忽略列表的其他元素。我想修复这个问题,我想添加另一个变量temp
来保存列表中每个元素的当前计数,并检查它是否大于count
,如果它是真的我{{{ 1}} set!
到count
,但我再次遇到递归问题。我的另一个想法是在每个步骤中使用另一个列表temp
append
并找到该列表中的最大值,但我也无法意识到这一点。任何想法如何解决这个问题?
答案 0 :(得分:1)
以下是使用map
的实现:
(define (max-depth l)
(define (helper depth el)
(cond
[(null? el) (add1 depth)]
[(list? el)
(apply max
(map (curry helper (add1 depth))
el))]
[else depth]))
(helper 0 l))
虽然我认为这种实现相当优雅,但它确实不是尾递归的。
这是一个稍微复杂,广度优先的尾递归实现:
(define (max-depth l)
(define (helper depth els)
(define remaining (filter list? els))
(if (zero? (length remaining))
depth
(helper (add1 depth) (apply append remaining))))
(helper 1 l))