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 a
ou 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 a
e b
trocadas. A chamada auxiliar a?b
conta os caminhos em que o primeiro movimento diminui a
e, portanto, b?a
conta aqueles em que o primeiro movimento diminui b
. Em geral, são diferentes e adicionam a a%b
.
O somatório em a?b
també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%i
por a?i+i?a
na 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=1
nós teríamos 0%0=0?0+0?0=2
. Isso permite definir f n=n?n
sem a metade que precisaríamos fazer.