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%bto liczba ścieżek uzyskać wieżę od (a,b)celu (0,0), przy użyciu jedynie przesuwa spadek współrzędnych. Pierwszy ruch albo maleje, aalbo 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 ai bzamieniły się. Wywołanie pomocnicze a?bliczy ścieżki, w których zmniejsza się pierwszy ruch a, a więc b?aliczy te, w których zmniejsza się pierwszy ruch b. Są one ogólnie różne i dodają się do a%b.
Podsumowanie a?bmoż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?aw 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?nbez zmniejszania o połowę tego, co chcielibyśmy zrobić w innym przypadku.