从方案列表中获取最长子列表的大小

时间:2011-09-29 17:05:08

标签: functional-programming scheme racket

我想从列表中获取最长子列表的大小。

例如

(getlongest((a)b(d e m n)(a d(c m g c y u m l d)a)))

返回9,因为(c m g c y u m l d)的大小为9。

我写了这个函数

(define getlongest
  (lambda (ls)
    (cond 
     ((null? ls)0)
     (else
      (cond
        ((atom? (car ls))
       (+ 1 (getlongest (cdr ls))))
         (else
          (max (getlongest(car ls)) (getlongest(cdr ls)))))))))

但是,如果我写

(getlongest ((a) (a (d d d e) m)))

我得到5.有人可以帮我解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:1)

因此,代码的问题在于,即使您继续发现该列表的子列表实际上是最长的,您也计算了已经计入的列表部分的1个长度。例如,对于这种情况,您的代码也返回5:(getlongest '(a (b (c (d (e))))))

您的方法很难轻松修复。我认为,当你递归时,你需要传递更多的数据;如果每次拨打getlongest都知道当前的长度,那么你应该能够获得正确的最大值。

如果这不是作业,这就是我如何本能地编写相同的功能(尽可能不高效,但很简单:)

(define (get-longest x)
  (cond ((null? x) 0)
        ((atom? x) 1)
        ; else take either the length of this list, or of the longest sub-list
        (else (apply max (length x) (map get-longest x)))))