Introduzione

Negli articoli precedenti ci siamo soffermati sulle funzioni personalizzate ricorsive. Come abbiamo visto, queste ultime hanno una limitazione intrinseca: non possono superare le 10.000 o 50.000 ricorsioni. Generalmente questo non costituisce un problema, ma in alcuni casi può convenire utilizzare un calcolo non ricorsivo, spesso anche più veloce.

In quali casi conviene utilizzare una funzione non ricorsiva? Partiamo da un esempio pratico.

Funzioni personalizzate: quando la ricorsione è un limite

Supponiamo di voler definire una funzione personalizzata che ripeta una stringa di testo per un determinato numero di volte. La chiameremo

[box type="shadow" align="aligncenter" ]// Repeat ( text ; numberOfTimes ) recursive custom function
If ( numberOfTimes > 0 ; text & Repeat ( text ; numberOfTimes - 1 ) )[/box]

Il risultato della funzione Repeat ( "a" ; 200 ) sarà una stringa di testo formata da 200 caratteri "a".

Il risultato della funzione Repeat ( "a" ; 12000 ) sarà invece un bel "?" (punto interrogativo) perchè abbiamo superato le 10.000 ricorsioni.

Come possiamo superare questi limiti?

La magia delle potenze di 10 nelle ripetizioni

E ora, un po' di matematica. Ve le ricordate? Sono proprio loro: le potenze di 10.

10^0 = 1
10^1 = 10
10^2 = 100
10^10 = 10000000000

Sottraendo -1 dai singoli risultati avremo:

0
9
99
9999999999

cioè un numero di "9" corrispondente a ciascuna potenza. Basandoci su questo dato, sarà semplice ottenere un calcolo del tipo Substitute ( 10^200 - 1 ; 9 ; "a" ) per ottenere una stringa di testo formata da 200 caratteri "a", cioè lo stesso risultato ottenibile con la funzione ricorsiva vista sopra, ma senza usare alcuna ricorsione.

Fantastico, no?

C'è però un problema: Filemaker valuta le potenze fino a 404, che equivale al numero massimo possibile di caratteri "a" ottenibili. Infatti il risultato di Substitute (10^405 - 1 ; 9 ; "a") sarà un bel "?", proprio perchè abbiamo superato detto limite.

A questo punto possiamo operare due tipi di sostituzione ed aggregarli, in modo da raggiungere i 161.999 caratteri. Questo è possibile con la funzione personalizzata di Michael Horak, Repeat ( text ; numberOfTimes ), che qui riportiamo:

[box type="shadow" align="aligncenter" ]/*
Repeat function
Repeats text number of times
Author
*COMMENT Visual Realisation
Format
Repeat ( text ; numberOfTimes )
Parameters
text – any text that also contains a number
numberOfTimes – integer
Data type returned
text
Description
Repeats text the specified number of times. This simple non-recursive calculation extends the limit of allowable repeats up to 161,999 (with a plain Substitute ( 10^numberOfTimes – 1 ; “9″ ; text ) the limit is 404 repeats, while the obvious recursive function would be limited to 10,000 recursions).
December 14, 2008
*/
Let ( [
a = Div (numberOfTimes; 400 ) ;
b = Mod (numberOfTimes; 400 )
] ;
Case (
a ; Substitute ( 10^a – 1 ; [ "9" ; 10^400 - 1 ] ; [ "9" ; text ] ) ) &
Case (
b ; Substitute ( 10^b – 1 ; “9″ ; text ) )
)[/box]

Se volete approfondire ulteriormente il problema vi interesserà sicuramente l'articolo di Steve Lane, all'indirizzo: http://www.soliantconsulting.com/blog/2013/01/power-division

A noi è servito per introdurre un concetto utilizzato in una delle più belle ed utili funzioni personalizzate NON ricorsive mai apparse:

CustomList ( Start ; End ; Function ) di Agnes Barouh

http://www.briandunning.com/cf/868

Conclusioni

In questo articolo abbiamo fatto la conoscenza delle funzioni personalizzate non ricorsive, partendo dai limiti delle funzioni ricorsive e scoperto che spesso attraverso la magia delle potenze di 10 è possibile evitare di utilizzare le ricorsioni. Tutto chiaro?

LASCIA UN COMMENTO

Please enter your comment!
Please enter your name here