जावास्क्रिप्ट (ईएस 6), 65 64 बाइट्स
f=(a,i=1)=>a>i?(c=f(a-i,i+=2))[0]==i?[i-2,...c]:f(a,i):a<i?0:[i]
यदि कोई समाधान है, या 0 के लिए कोई समाधान नहीं है, तो एक सरणी देता है।
यह समस्या के लिए एक अत्यधिक अक्षम अभी तक गोल्फ समाधान है।
यह पहले समाधान का उपयोग करके खोज करता है a-iऔर i=1, भले ही यह पुनरावर्ती स्टैक का काम न करे। यदि वह समाधान शुरू नहीं होता है i+2, तो हम पुन: उपयोग करके पहले समाधान के लिए खोज करते हैं aऔर i+2।
Ungolfed
f=(a,i=1)=>
a > i ?
(c = f(a - i, i += 2))[0] == i ?
[i-2, ...c] :
f(a, i) :
a < i ?
0 :
[i]
परीक्षण के मामलों:
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]
यह कितना अक्षम है, इस विचार के लिए, f(104)69,535 पुनरावर्ती कॉल की आवश्यकता है। स्टैक कभी भी 51 से अधिक स्तर गहरा नहीं होता है, इसलिए स्टैक ओवरफ्लो के साथ कोई समस्या नहीं है।
समाधान के f(200)लिए 8.6 मिलियन पुनरावर्ती कॉल की आवश्यकता होती है , जिसमें एक स्टैक 99 का स्तर गहरा होता है। (इसका समाधान है [11,13,15,17,19,21,23,25,27,29]।)
यहां चल रहे कार्यक्रम का एक दृश्य प्रतिनिधित्व है:
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>