Как подсчитать вхождение списка в другой список в схеме - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь посчитать появление списка в другом, но я застрял. Я не знаю, есть ли какая-либо функция для этого, но вот мой код. На самом деле он находит первый случай и возвращается к 1. Как я могу продолжать считать?

    (define *test* '(a b c a b a b a b c  b c b c a b c))

    (define match
      (lambda (pattern text) (cond ((null? pattern) 1)
                                   ((null? text) 0)
                                   ((eq? (car text) (car pattern)) 
                                      (match (cdr pattern) (cdr text)))
                                   (else (match pattern (cdr text))))
    ))

1 Ответ

0 голосов
/ 24 февраля 2019

Ваш код проверяет позиции в списке, пока не найдет совпадение, и если он это сделает, он вернет, что нашел совпадение. Вы хотите проверить каждую позицию в списке и сложить те, которые содержат шаблон, но так как ваш код смотрит вперед, чтобы найти шаблон, трудно контролировать, над какой частью списка он работает. Я не смог «исправить» проблему в вашем коде, поэтому я решил написать что-то с нуля. Надеюсь, это имеет смысл:

(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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...