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
без деления пополам, что нам нужно для других.