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
без навпіл, що нам потрібно було б зробити.