Elisir - Ricorsione

La ricorsione è un metodo in cui la soluzione a un problema dipende dalle soluzioni alle istanze più piccole dello stesso problema. La maggior parte dei linguaggi di programmazione per computer supporta la ricorsione consentendo a una funzione di chiamare se stessa all'interno del testo del programma.

Idealmente le funzioni ricorsive hanno una condizione finale. Questa condizione finale, nota anche come caso di base, interrompe il rientro nella funzione e l'aggiunta di chiamate di funzione allo stack. Qui è dove si ferma la chiamata di funzione ricorsiva. Consideriamo il seguente esempio per comprendere ulteriormente la funzione ricorsiva.

defmodule Math do
   def fact(res, num) do
   if num === 1 do
      res
   else
      new_res = res * num
      fact(new_res, num-1)
      end
   end
end

IO.puts(Math.fact(1,5))

Quando il programma precedente viene eseguito, genera il seguente risultato:

120

Quindi nella funzione sopra, Math.fact, stiamo calcolando il fattoriale di un numero. Notare che stiamo chiamando la funzione al suo interno. Vediamo ora come funziona.

Gli abbiamo fornito 1 e il numero di cui vogliamo calcolare il fattoriale. La funzione controlla se il numero è 1 o meno e restituisce res se è 1(Ending condition). In caso contrario, crea una variabile new_res e le assegna il valore del precedente res * current num. Restituisce il valore restituito dalla nostra chiamata di funzione fact (new_res, num-1) . Questo si ripete finché non otteniamo num come 1. Una volta che ciò accade, otteniamo il risultato.

Consideriamo un altro esempio, stampando ogni elemento della lista uno per uno. Per fare ciò, utilizzeremo ilhd e tl funzioni di elenchi e corrispondenza di modelli nelle funzioni -

a = ["Hey", 100, 452, :true, "People"]
defmodule ListPrint do
   def print([]) do
   end
   def print([head | tail]) do 
      IO.puts(head)
      print(tail)
   end
end

ListPrint.print(a)

La prima funzione di stampa viene chiamata quando abbiamo un elenco vuoto(ending condition). In caso contrario, verrà chiamata la seconda funzione di stampa che dividerà la lista in 2 e assegnerà il primo elemento della lista a testa e il rimanente della lista a coda. La testa quindi viene stampata e chiamiamo di nuovo la funzione di stampa con il resto della lista, cioè coda. Quando il programma di cui sopra viene eseguito, produce il seguente risultato:

Hey
100
452
true
People