0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Hãy thử trực tuyến!
Một triển khai khá trực tiếp mà đệ quy trên 2 biến.
Đây là cách chúng ta có thể có được giải pháp này. Bắt đầu với mã thực hiện một công thức đệ quy trực tiếp:
54 byte
0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n
Hãy thử trực tuyến!
Sử dụng giải thích di chuyển tân binh của flawr , a%b
là số đường dẫn đưa rook từ đó (a,b)
đến (0,0)
, chỉ sử dụng di chuyển giảm tọa độ. Di chuyển đầu tiên giảm a
hoặc giảm b
, giữ nguyên khác, do đó công thức đệ quy.
49 byte
a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n
Hãy thử trực tuyến!
Chúng ta có thể tránh sự lặp lại map(a%)[0..b-1]++map(b%)[0..a-1]
bằng cách lưu ý rằng hai nửa giống nhau a
và b
hoán đổi. Cuộc gọi phụ trợ a?b
đếm các đường dẫn nơi di chuyển đầu tiên giảm a
và do đó, đếm các đường dẫn b?a
di chuyển đầu tiên giảm b
. Đây là nói chung khác nhau, và họ thêm vào a%b
.
Tổng kết trong a?b
cũng có thể được viết như một sự hiểu biết danh sách a?b=sum[a%i|i<-[0..b-1]]
.
42 byte
0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n
Hãy thử trực tuyến!
Cuối cùng, chúng tôi thoát khỏi %
và chỉ viết đệ quy ?
bằng cách thay thế a%i
bằng a?i+i?a
trong cuộc gọi đệ quy.
Trường hợp cơ sở mới khiến điều này ?
mang lại kết quả gấp đôi so với ?
phiên bản 49 byte, kể từ đó 0?0=1
, chúng ta sẽ có 0%0=0?0+0?0=2
. Điều này cho phép sử dụng xác định f n=n?n
mà không cần giảm một nửa mà chúng ta cần phải làm.