Non proprio, prendi il mio programma, in particolare focalizziamo sulla procedura nfa().
Prediamo come grafo questo, riconosce tutte le stringhe in cui il terzultimo simbolo è 0:
Se eseguiamo il programma la lista delle transizioni sarà la seguente (con un po' di fantasia):
Codice: Seleziona tutto
s0: | '0', s0 | -> | '1', s0 | - > | '0', s1 |
s1: | '0', s2 | -> | '1', s2 |
s1: | '0', s3 | -> | '1', s3 |
s3: NULL
In cui ad esempio
E' la lista di transizioni dello stato s0, il primo campo del rettangolino è il simbolo che porta al prossimo stato, cioè al secondo campo del rettangolino. Quindi da s0 con il simbolo '0' vado ad s0 stesso, con il simbolo '1' vado ad s0 e con '0' vado anche a s1.
Supponiamo che la stringa in input sia "000" e vediamo come si svolge la computazione della procedura nfa():
la variabile accettato parte da 0, entriamo nel ramo else del primo if, il secondo if è falso, quindi entriamo nel while (la condizione è vera). Il primo simbolo della stringa corrisponde al simbolo della (prima) transizione, quindi effettuo una chiamata ricorsiva a nfa passando la stringa "00" e lo stato s0 (seguo quindi la transizione riconosciuta). La stessa cosa avviene per la stringa "00" (mi sposto in s0 e richiamo nfa su "0" e s0) e per "0", mi sposto sempre su s0 e richiamo nfa() su "\n" e s0.
Ora il simbolo ('\n') non viene riconosciuto dalla prima transizione, quindi l'if interno al while fallisce e viene eseguito t = t->next passando quindi alla prossima transizione, che non verrà riconosciuta, come anche quella dopo, quindi ora t punterà a NULL, si esce dal while e l'ultima chiamata di nfa(), quella con "\n" e s0, ritornerà 0, che risalendo lo stack delle chiamate avremo che nfa("00", s0) sarà 0 (la nostra prima chiamata ricorsiva), quindi accettato sarà 0.
Questo vuol dire che abbiamo esaurito tutte le computazioni partendo come scelta iniziale la transizione che con il simbolo 0 porta a s0, ora verrà eseguito t = t->next che ci porta alla transizione | '1', s0 | che non verrà riconosciuta perché il simbolo è diverso (ora siamo all'interno della chiamata iniziale di nfa(), quindi primo zero), quindi si passa all'ultima transizione: | '0', q1 | che se continuiamo la computazione ci porterà ad uno stato finale.
Spero di aver reso l'idea e di aver chiarito qualche dubbio che avevi.