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%bes 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 ao 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 ae bintercambiadas. La llamada auxiliar a?bcuenta las rutas donde disminuye el primer movimiento a, y así b?acuenta aquellas donde disminuye el primer movimiento b. En general, estos son diferentes, y se suman a a%b.
La suma en a?btambié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%icon a?i+i?aen 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?nsin la reducción a la mitad que otros necesitaríamos hacer.