我想从列表中获取最长子列表的大小。
例如
(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.有人可以帮我解决这个问题吗?
由于
答案 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)))))