Таким образом, проблема с вашим кодом состоит в том, что вы подсчитываете 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)))))