0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Provalo online!
Un'implementazione abbastanza diretta che ricorre su 2 variabili.
Ecco come possiamo ottenere questa soluzione. Inizia con il codice che implementa una formula ricorsiva diretta:
54 byte
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
Provalo online!
utilizzando l'interpretazione rook mossa di flawr , a%bè il numero di percorsi che ottengono la torre da (a,b)a (0,0), utilizzando muove solo la diminuzione una coordinata. La prima mossa diminuisce ao diminuisce b, mantenendo l'altra uguale, quindi la formula ricorsiva.
49 byte
a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n
Provalo online!
Possiamo evitare la ripetizione map(a%)[0..b-1]++map(b%)[0..a-1]osservando che le due metà sono uguali ae bscambiate. La chiamata ausiliariaa?b conta i percorsi in cui diminuisce la prima mossa a, quindi b?aconta quelli in cui diminuisce la prima mossa b. Questi sono generalmente diversi e si aggiungono a a%b.
La sintesi in a?bpuò anche essere scritta come una comprensione della lista a?b=sum[a%i|i<-[0..b-1]].
42 byte
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Provalo online!
Alla fine, ci liberiamo %e scriviamo semplicemente la ricorsione in termini di? sostituendola a%icon a?i+i?anella chiamata ricorsiva.
Il nuovo caso base fa sì che questo ?dia un output doppio rispetto a quello della versione ?a 49 byte, poiché con 0?0=1, avremmo 0%0=0?0+0?0=2. Ciò consente di definire f n=n?nsenza il dimezzamento che gli altri dovrebbero fare.