0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Wypróbuj online!
Dość bezpośrednia implementacja, która powtarza ponad 2 zmienne.
Oto, w jaki sposób możemy uzyskać to rozwiązanie. Zacznij od kodu implementującego bezpośrednią rekurencyjną formułę:
54 bajty
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
Wypróbuj online!
Korzystanie interpretację gawron ruch flawr jest , a%b
to liczba ścieżek uzyskać wieżę od (a,b)
celu (0,0)
, przy użyciu jedynie przesuwa spadek współrzędnych. Pierwszy ruch albo maleje, a
albo malejeb
, pozostawiając ten sam drugi, stąd formuła rekurencyjna.
49 bajtów
a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n
Wypróbuj online!
Możemy uniknąć powtórzeń map(a%)[0..b-1]++map(b%)[0..a-1]
, zauważając, że dwie połówki są takie same a
i b
zamieniły się. Wywołanie pomocnicze a?b
liczy ścieżki, w których zmniejsza się pierwszy ruch a
, a więc b?a
liczy te, w których zmniejsza się pierwszy ruch b
. Są one ogólnie różne i dodają się do a%b
.
Podsumowanie a?b
można również napisać w formie listy a?b=sum[a%i|i<-[0..b-1]]
.
42 bajty
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Wypróbuj online!
Wreszcie pozbywamy się %
i po prostu piszemy rekursję pod względem ?
zastępowaniaa%i
ją a?i+i?a
w wywołaniu rekurencyjnym.
Nowy przypadek podstawowy powoduje, że ?
daje to wynik podwójny ?
w porównaniu z wersją 49-bajtową, ponieważ z 0?0=1
, mielibyśmy 0%0=0?0+0?0=2
. Pozwala to na użycie funkcji Definiuj f n=n?n
bez zmniejszania o połowę tego, co chcielibyśmy zrobić w innym przypadku.