计划中的深度列表

时间:2014-12-06 21:09:20

标签: list recursion scheme racket

我试图在方案中编写一个能够找到列表最大深度的程序。到目前为止我的代码是:


(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并找到该列表中的最大值,但我也无法意识到这一点。任何想法如何解决这个问题?

1 个答案:

答案 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))