0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Pruébalo en línea!
Una implementación bastante directa que recurre a más de 2 variables.
Así es como podemos obtener esta solución. Comience con el código que implementa una fórmula recursiva directa:
54 bytes
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
Pruébalo en línea!
Usando la interpretación de movimiento de torre de flawr , a%b
es el número de caminos que llevan la torre de (a,b)
a (0,0)
, usando solo movimientos para disminuir una coordenada. El primer movimiento disminuye a
o disminuye b
, manteniendo el otro igual, de ahí la fórmula recursiva.
49 bytes
a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n
Pruébalo en línea!
Podemos evitar la repetición map(a%)[0..b-1]++map(b%)[0..a-1]
al notar que las dos mitades son iguales a
e b
intercambiadas. La llamada auxiliar a?b
cuenta las rutas donde disminuye el primer movimiento a
, y así b?a
cuenta aquellas donde disminuye el primer movimiento b
. En general, estos son diferentes, y se suman a a%b
.
La suma en a?b
también se puede escribir como una lista de comprensión a?b=sum[a%i|i<-[0..b-1]]
.
42 bytes
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Pruébalo en línea!
Finalmente, nos deshacemos %
y simplemente escribimos la recursión en términos de ?
reemplazando a%i
con a?i+i?a
en la llamada recursiva.
El nuevo caso base hace que esto ?
dé el doble de salidas que ?
en la versión de 49 bytes, ya que con 0?0=1
, tendríamos 0%0=0?0+0?0=2
. Esto permite definir f n=n?n
sin la reducción a la mitad que otros necesitaríamos hacer.