Generazione con funzioni ricorsive

All'interno della definizione di una funzione è possibile inserire una o più chiamate alla funzione stessa. Quando la funzione verrà eseguita verranno effettuate anche le chiamate interne che, a loro volta, effettueranno altre chiamate e così via. Sfruttando questa caratteristica è possibile far generare configurazioni composte da un elemento base che si ripete modificato e moltiplicato all'infinito.

function disegnaElemento( parametri, livello )
{
    ... // disegna elemento in base a parametri e livello

    livello++;
    if (livello < totLivelli) {
        ... // modifica di uno più parametri
        disegnaElemento( parametriModificati, livello );
        ... // modifica di uno più parametri
        disegnaElemento( parametriModificati, livello );
    }
}
function disegnaElemento( parametri, livello )

La funzione ha uno o più parametri che permettono di modificare l'esecuzione a ogni (sotto)chiamata. In alcuni casi il solo livello di ricorsione può essere sufficiente per ricavare gli altri parametri.

livello++;

Per tenere traccia del livello di ricorsione il valore della variabile di riferimento dev'essere incrementato prima delle chiamate interne.

if (livello < totLivelli) {

La variabile usata per tenere tracia del livello di ricorsione viene sempre controllata per capire se continuare con ulteriori chiamate. In caso contrario la ricorsione procederebbe all'infinito impedendo la conclusione dello sketch.

... // modifica di uno più parametri
disegnaElemento( parametriModificati, livello );

Prima che la funzione chiami se stessa è necessario modificare i parametri per evitare che venga disegnato sempre lo stesso elemento nella stessa posizione. La funzione può quindi chiamare se stessa una, due o più volte con parametri diversi ma con lo stesso nuovo valore di livello.

Espandendo il codice di una ricorsione in cui il livello massimo fosse 3, la sequenza delle chiamate sarebbe questa:

 chiama disegnaElemento() 
     disegna elemento A // livello 0 
     chiama disegnaElemento()        
         disegna elemento AA // livello 1 
         chiama disegnaElemento()         
             disegna elemento AAA // livello 2 
             chiama disegnaElemento()          
                 disegna elemento AAAA // livello 3 
             chiama disegnaElemento()          
                 disegna elemento AAAB // livello 3 
         chiama disegnaElemento()         
             disegna elemento AAB // livello 2 
             chiama disegnaElemento()          
                 disegna elemento AABA // livello 3 
             chiama disegnaElemento()          
                 disegna elemento AABB // livello 3 
     chiama disegnaElemento()        
         disegna elemento AB // livello 1 
         chiama disegnaElemento()         
             disegna elemento ABA // livello 2 
             chiama disegnaElemento()          
                 disegna elemento ABAA // livello 3 
             chiama disegnaElemento()          
                 disegna elemento ABAB // livello 3 
         chiama disegnaElemento()         
             disegna elemento ABB // livello 2 
             chiama disegnaElemento()          
                 disegna elemento ABBA // livello 3 
             chiama disegnaElemento()          
                 disegna elemento ABBB // livello 3