0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Спробуйте в Інтернеті!
Досить пряма реалізація, яка повторюється понад 2 змінних.
Ось як ми можемо отримати це рішення. Почніть з коду, що реалізує пряму рекурсивну формулу:
54 байти
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
Спробуйте в Інтернеті!
Використовуючи інтерпретацію переміщення ладу flawr , a%b- це кількість шляхів, які отримують грак (a,b)до (0,0), використовуючи лише переміщення координати зменшення. Перший хід або зменшується, aабо зменшується b, зберігаючи другий таким же, звідси і рекурсивна формула.
49 байт
a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n
Спробуйте в Інтернеті!
Ми можемо уникнути повторення map(a%)[0..b-1]++map(b%)[0..a-1], зазначивши, що дві половинки однакові aі bзамінені. Допоміжний виклик a?bпідраховує шляхи, де зменшується перший хід a, і так b?aрахує ті, де зменшується перший хід b. Вони взагалі різні, і вони додають a%b.
Підсумок у a?bтакож може бути записаний як розуміння списку a?b=sum[a%i|i<-[0..b-1]].
42 байти
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Спробуйте в Інтернеті!
Нарешті, ми позбутися %і просто написати рекурсию з точки зору ?шляхом заміни a%iз a?i+i?aв рекурсивном виклик.
Новий базовий випадок призводить ?до того, що виходи вдвічі перевищують показники ?у 49-байтовій версії, оскільки у 0?0=1нас це буде 0%0=0?0+0?0=2. Це дозволяє використовувати визначення f n=n?nбез навпіл, що нам потрібно було б зробити.