маленькая программа поиска текста, похожая на человека - PullRequest
1 голос
/ 20 мая 2011

Я пытаюсь создать небольшую программу поиска текста, похожую на человеческую, по схеме

, но время от времени эта программа не работает должным образом

, и я не могу уловить ошибку в течение многих часов

Может кто-нибудь сказать мне, что не так с моим кодом?

и разве это не очень хорошая идея для поиска текста?

, когда я ищу строку "exp" в текстевозникает файл, который не содержит ничего, кроме строки «explorer», и сообщает Found 0

(define (search str)
  (set! count 0)
  (define len (length str))
  ;null character calculating 
  (define data-len (- (length data) 1))
  ;when string length is less than or equal to data-length
  (when (and (not (= 0 len)) (>= data-len len))
    (define first-char (first str))
    (define last-char (last str))
    ;is it correct?
    (define (exact? str len index)
      (if (equal? str (drop (take data (+ index len)) index))
          #t
          #f))
    ;check first and last character of string if correct, check whether this string is correct completely, if so, skip to next index
    (define (loop [index 0])
      (when (> data-len index)
        (if (and (equal? first-char (list-ref data index)) 
                 (equal? last-char (list-ref data (+ index len -1))))
            (when (exact? str len index)
              (set! count (+ count 1))
              (loop (+ index len)))
            (loop (+ index 1)))))
    (loop))
  (send msg set-label (format "Found : ~a" count)))

1 Ответ

0 голосов
/ 24 июля 2015

Я знаю, что прошло четыре года, но я испытываю ностальгию по своему классу SCHEME, поэтому я сделал что-то. (Я бы прокомментировал вместо того, чтобы отвечать, но у меня пока недостаточно репутации ... И у меня, вероятно, будет меньше.)

(define (find-pattern pat str); Returns a list of locations of PATturn in STRing.
  (define (pattern-found? pat-list str-list); Is the pattern (pat-list) at the beginning of this string (str-list)? Also, they're lists, now.
    (cond ((null? pat-list) #t); The base case for the recursion.
          ((null? str-list) #f); Obvious
          ((eq? (car pat-list) (car str-list)); First letter matches
           (pattern-found? (cdr pat-list) (cdr str-list))); Recurse
          (else #f)))
  (define (look-for-pattern pat-list str-list counter results-list)
    (cond ((null? str-list) results-list); Base case
          ((pattern-found? pat-list str-list)
           (look-for-pattern pat-list
                             (cdr str-list)
                             (+ counter 1)
                             (cons counter results-list)))
          (else (look-for-pattern pat-list
                                  (cdr str-list)
                                  (+ counter 1)
                                  results-list))))
  (look-for-pattern (string->list pat)
                    (string->list str)
                    0
                    '()))

РЕДАКТИРОВАТЬ: я имею в виду, что прошло четыре года с момента вопроса, а не с класса SCHEME. Это было бы немного жутко, но опять же, кто знает, что я буду чувствовать через три года?

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