0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Experimente online!
Uma implementação bastante direta que se repete mais de 2 variáveis.
Veja como podemos obter esta solução. Comece com o código implementando uma fórmula recursiva direta:
54 bytes
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
Experimente online!
Usando a interpretação de movimento da torre de flawr , a%bé o número de caminhos que levam a torre de (a,b)para (0,0), usando apenas os movimentos para diminuir uma coordenada. O primeiro movimento diminui aou diminui b, mantendo o outro igual, daí a 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
Experimente online!
Podemos evitar a repetição map(a%)[0..b-1]++map(b%)[0..a-1]observando que as duas metades são iguais ae btrocadas. A chamada auxiliar a?bconta os caminhos em que o primeiro movimento diminui ae, portanto, b?aconta aqueles em que o primeiro movimento diminui b. Em geral, são diferentes e adicionam a a%b.
O somatório em a?btambém pode ser escrito como uma compreensão da lista 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
Experimente online!
Finalmente, nos livramos %e escrevemos a recursão em termos de ?substituindo a%ipor a?i+i?ana chamada recursiva.
O novo caso base faz com que isso ?dê a saídas o dobro do da ?versão de 49 bytes, já que com 0?0=1nós teríamos 0%0=0?0+0?0=2. Isso permite definir f n=n?nsem a metade que precisaríamos fazer.