Вы получаете ошибку, потому что ваш последний рекурсивный вызов в оптимальном является неправильным.
Вы берете префикс i-1
для x
или j-1
для y
, но как насчет другого? j
и i
могут быть меньше, чем длина соответствующих строк, и поэтому вам необходимо соответствующим образом добавить префикс аргумента.
Следующий код работает правильно.
(define (LCS x y)
(define (optimal i j)
(cond
((or (= i 0) (= j 0)) 0)
((eq? (pick i x) (pick j y)) (+ 1 (optimal (- i 1) (- j 1))))
(else (max (LCS (prefix (- i 1) x) (prefix j y)) (LCS (prefix i x) (prefix (- j 1) y))))))
(optimal (length x) (length y)))
Обратите внимание, что эта проблема существует только потому, что вы смешиваете два разных типа вызовов. Один, который вызывает LCS
для префиксов, и другой, который вызывает optimal
с меньшими значениями i и j.
Вы можете заменить LCS
вызовы на оптимальные для более простого решения.
(define (LCS x y)
(define (optimal i j)
(cond
((or (= i 0) (= j 0)) 0)
((eq? (pick i x) (pick j y)) (+ 1 (optimal (- i 1) (- j 1))))
(else (max (optimal (- i 1) j) (optimal i (- j 1))))))
(optimal (length x) (length y)))