Magazine High tech

Knuth-Morris-Pratt en style récursif

Publié le 13 mai 2008 par Lbloch

Voici comme promis une version en style récursif du programme Knuth-Morris-Pratt. Ce type d'exercice est plein de pièges : si vous découvrez que je suis tombé dans l'un d'entre eux, je serais content que vous me le signaliez.

(module kmp-table (export (kmp:table Word))) (define (kmp:table Word) (let* ((WordLength (string-length Word)) (Tpref (make-vector (+ WordLength 1) 0)) ) (vector-set! Tpref 0 -1) (let boucle ((i 0) (j -1) (c #a000)) ;; null character (if (>= i WordLength) Tpref (cond ((char=? c (string-ref Word i)) (vector-set! Tpref (+ i 1) (+ j 1)) (boucle (+ i 1) (+ j 1) (string-ref Word (+ j 1)))) ((> j 0) (let ((j2 (vector-ref Tpref j))) (boucle i j2 (string-ref Word j2)))) (else (vector-set! Tpref (+ i 1) 0) (boucle (+ i 1) 0 (string-ref Word 0)))) ) ))) (module kmp (main main) (import kmp-table)) (define (main args) (print (kmp:KMP (cadr args) (caddr args)))) (define (kmp:KMP Word Text) (let ((Tpref (kmp:table Word)) (L-texte (string-length Text)) (LastCharPos (- (string-length Word) 1))) (let boucle ((ii 0) (mm 0)) (cond ((>= (+ ii mm) L-texte) -1) ((char=? (string-ref Text (+ ii mm)) (string-ref Word mm)) (if (= mm LastCharPos) ii (boucle ii (+ mm 1)))) (else (boucle (- (+ ii mm) (vector-ref Tpref mm)) (if (> mm 0) (vector-ref Tpref mm) mm))) ) ) ))

Retour à La Une de Logo Paperblog

A propos de l’auteur


Lbloch 52 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte