JavaScript (ES6), 65 64 byte
f=(a,i=1)=>a>i?(c=f(a-i,i+=2))[0]==i?[i-2,...c]:f(a,i):a<i?0:[i]
Trả về một mảng nếu có giải pháp hoặc 0 không có giải pháp.
Đây là một giải pháp golf không hiệu quả cao cho vấn đề.
Nó tìm kiếm giải pháp đầu tiên bằng cách sử dụng a-i
và i=1
, ngay cả khi nó không hoạt động với ngăn xếp đệ quy. Nếu giải pháp đó không bắt đầu i+2
, thì chúng tôi sẽ tìm kiếm giải pháp đầu tiên bằng cách sử dụng a
và i+2
.
Bị đánh cắp
f=(a,i=1)=>
a > i ?
(c = f(a - i, i += 2))[0] == i ?
[i-2, ...c] :
f(a, i) :
a < i ?
0 :
[i]
Các trường hợp thử nghiệm:
f=(a,i=1)=>a>i?(c=f(a-i,i+=2))[0]==i?[i-2,...c]:f(a,i):a<i?0:[i]
console.log(JSON.stringify(f(1))); //[1]
console.log(JSON.stringify(f(3))); //[3]
console.log(JSON.stringify(f(4))); //[1, 3]
console.log(JSON.stringify(f(5))); //[5]
console.log(JSON.stringify(f(6))); //[0]
console.log(JSON.stringify(f(9))); //[1, 3, 5]
console.log(JSON.stringify(f(15))); //[3, 5, 7]
console.log(JSON.stringify(f(104))); //[23, 25, 27, 29]
Đối với một ý tưởng về cách thức này không hiệu quả, giải pháp f(104)
yêu cầu 69.535 cuộc gọi đệ quy. Ngăn xếp không bao giờ sâu hơn 51 cấp, vì vậy không có vấn đề gì với stack stack.
Giải pháp f(200)
yêu cầu 8,6 triệu cuộc gọi đệ quy, với một ngăn xếp sâu 99 cấp. (Giải pháp của nó là[11,13,15,17,19,21,23,25,27,29]
.)
Đây là một đại diện trực quan của chương trình đang chạy:
r=0;
output=o=>setTimeout(_=>O.textContent += o + '\n', r++ * 20);
f=(a,i=1,s='',o = s + 'a=' + a + '; i=' + i + ';')=>
(
output(o),
a > i ?
(c = f(a - i, i += 2, s + ' '))[0] == i ? (
output(o + ' a > i; [i-2, ...c] = [' + [i-2, ...c] + '];'),
[i-2, ...c]
) : (
output(o + ' a > i; c=[' + c + ']; ' + 'c[0]+2 != i ... dead end\n' + s + 'trying a, i+2:'),
f(a, i, s)
) :
a < i ? (
output(o + ' a < i ... dead end'),
0
) : (
output(o + ' a == i;'),
[i]
)
)
f(21); //[5, 7, 9]
<pre id=O></pre>