2013-05-05 7 views
5

Ho una struttura dati che rappresenta una firma di tipo, questa struttura dati è un albero esemplificato nella prima immagine come quella rossa. Vorrei ottenere quello nero e finora ho ottenuto solo quello arancione (seconda immagine), che è l'albero del tipo ma associato a sinistra.Riscrittura alberi

enter image description here

Ecco l'arancio che ho finora (seguire le frecce arancioni)

enter image description here

avevo risolto questo problema abbastanza stampa l'albero e poi l'analisi con un parser combinator, ma questa inefficienza non è desiderata. Penso di poter avere un altro algoritmo per convertire dall'albero arancione a quello nero, ma sarebbe meglio se invece di comporre due algoritmi, potrei scrivere solo uno.

Etichetterò questo come Haskell mentre sto scrivendo la mia soluzione su di esso. Potrei fornire il codice per ottenere una struttura dati come l'albero rosso ma penso che complicherebbe solo il tentativo di soluzione ..

Vorrei sapere se esiste un nome per questo algoritmo e/o il nome della posizione dell'operatore nell'albero rosso è. È un prefisso?

Grazie.

+7

Quello che hai è '(a -> b) -> c'. Quello che hai è '(a -> b) -> c'. Quello che vuoi è 'a -> (b -> c)'. Penso che tu abbia commesso un errore nel decidere quale risultato desideri. –

+0

@DanielFischer In effetti, ora ho deciso di volere il risultato che volevo con l'aiuto degli stack, grazie per aver letto il mio casino –

risposta

4

Dai un'occhiata agli schemi di ricorsione. C'è una questione connessa qui che include carichi di link:

Recursion schemes for dummies?

Tutti i link su questa domanda sono eccellenti, ma mi piacerebbe particolarmente un'occhiata a diapositive Tim Williams' (link nella mia risposta a questa domanda) per le implementazioni concrete dei vari modelli di ricorsività (la maggior parte delle quali sono demoate sulle strutture ad albero).