#lang racket ; reprezentare nod: (pereche caracter . listă de noduri copii) ; rădăcina are pe prima poziție a perechii valoarea #f (sau altă valoare specială) ; am reprezentat cuvintele ca liste de literali ; am făcut implementarea după implementarea de Haskell, acolo sunt mai multe comentarii (define emptyTrie (cons #f '())) ; varianta A (define (canBeFollowedBy letter node) (member letter (map car (cdr node)))) (define (getSubTreeFor letter node) (let ((selected (filter (λ (n) (equal? (car n) letter)) (cdr node)))) (if (null? selected) #f (car selected)))) (define (addWord word node) (if (null? word) node (if (canBeFollowedBy (car word) node) (cons (car node) (cons (addWord (cdr word) (getSubTreeFor (car word) node)) (filter (λ (n) (not (equal? (car n) (car word)))) (cdr node)) ) ) (cons (car node) (cons (addWord (cdr word) (cons (car word) '())) (cdr node))) ))) ; varianta B (define (countWords node) (if (null? (cdr node)) 1 (apply + (map countWords (cdr node))))) (define (printWords node) (cond ((not (car node)) (apply append (map printWords (cdr node)))) ((null? (cdr node)) (list (list (car node)))) (else (map (λ (word) (cons (car node) word)) (apply append (map printWords (cdr node))))) )) (define (predict prefix node) (cond ((null? prefix) (printWords node)) ((not (car node)) (apply append (map ((curry predict) prefix) (cdr node)))) ((equal? (car node) (car prefix)) (map ((curry cons) (car prefix)) (apply append (map ((curry predict) (cdr prefix)) (cdr node))))) (else '()) )) ; altele (define (addWords words) (foldl (λ (word trie) (addWord word trie)) emptyTrie words)) ; (addWords (list (list 'm 'e 'l 'c) (list 'm 'i 'c 'a) (list 'm 'i 'n 'a) (list 'm 'a 'r 'e)))