Ваш код проверяет позиции в списке, пока не найдет совпадение, и если он это сделает, он вернет, что нашел совпадение. Вы хотите проверить каждую позицию в списке и сложить те, которые содержат шаблон, но так как ваш код смотрит вперед, чтобы найти шаблон, трудно контролировать, над какой частью списка он работает. Я не смог «исправить» проблему в вашем коде, поэтому я решил написать что-то с нуля. Надеюсь, это имеет смысл:
(define begins-with (lambda (starter-list full-list)
(cond ((null? starter-list) #t)
((eq? (car starter-list) (car full-list)) (begins-with (cdr starter-list) (cdr full-list)))
(else #f)
)))
(define count-matches
(lambda (pattern lst)
(cond ((null? lst) 0)
((begins-with pattern lst) (+ 1 (count-matches pattern (cdr lst))))
(else (count-matches pattern (cdr lst)))
Первая функция, begins-with
, не проверяет всю строку для шаблона, она просто проверяет, начинается ли она с шаблона. Это позволяет нам использовать другую функцию, count-matches
, для подсчета количества суффиксов, начинающихся с шаблона, другими словами, сколько раз шаблон появляется в строке.
Обратите внимание, что код, который я написал выше, будет подсчитывать перекрывающиеся последовательности, например, '(a b a)
появляется дважды в '(a b a b a)
.