सी # एआई प्रोग्राम के लिए मैं सबसे अच्छा अगला कदम खोजने के लिए एक रिकर्सिव कॉल का उपयोग करता हूं (वर्तमान बोर्ड स्थिति को स्टोर करने के लिए 30x30 ऐरे का उपयोग करके)। मैं प्रत्येक कदम के लिए, मैं देखना चाहता हूं कि नए बोर्ड राज्य से मैं कौन सी संभावित चाल कर सकता हूं, सबसे अच्छा होगा ... और तब तक जब तक मैं या तो "खेल का अंत" स्थिति तक नहीं पहुंच जाता (उसमें आगे कोई चाल संभव नहीं है राज्य) या एक टाइमर प्रक्रिया को रोकता है और कोई और रिकर्सिव कॉल नहीं किया जाता है (और "सर्वश्रेष्ठ" ज्ञात स्थिति वापस आती है)। यह सिर्फ यह बताने के लिए कि मुझे रिकर्सन का उपयोग क्यों करना चाहिए (यह पूंछ रिकर्सन नहीं है) और मैं एक एकल (वैश्विक) बोर्ड स्थिति का उपयोग नहीं कर सकता, लेकिन वर्तमान स्थिति से संभवतः सभी बोर्ड राज्यों को खोजना चाहिए।रिकर्सिव कॉल से पहले उपलब्ध स्टैक आकार की जांच करने का कोई तरीका है? (सी #)
(कभी-कभी) मुझे एक सिस्टम मिलता है। StackOverflowException। अगली रिकर्सिव कॉल से पहले उपलब्ध स्टैक स्पेस को देखने का कोई तरीका है? तब मैं वर्तमान स्थिति को "अब तक की सबसे अच्छी स्थिति" के रूप में वापस कर सकता हूं और अगली रिकर्सिव कॉल नहीं कर सकता। अर्थात। जब उपलब्ध ढेर बहुत छोटा हो जाता है तो इसे बेस केस के रूप में भी गिना जाना चाहिए।
पाठ्यक्रम का दूसरा विकल्प, प्रत्येक रिकर्सिव कॉल को एक कोशिश में डाल सकता है .. ब्लॉक ब्लॉक करें और सिस्टम को संभालें। स्टैक ओवरव्लो एक्सेप्शन इसे बेस केस के रूप में उपयोग करके?
अपना कोड फिर से डिजाइन करें? एक स्टैक ओवरफ्लो एक बग या खराब (सी #) कोड का संकेत है। स्टैक ओवरफ्लो को ट्रिगर करने के लिए आपको रिकर्सिव कॉल की पागल राशि की आवश्यकता होती है। यदि आप वास्तव में ऐसा करना चाहते हैं तो F # की तरह पूंछ-कॉल का समर्थन करने वाली एक कार्यात्मक भाषा का उपयोग करें। सी # इसके लिए डिज़ाइन नहीं किया गया है। – Dykam
"यदि आप एक रिकर्सिव विधि या कई स्टैक स्पेस का उपयोग करने की योजना बना रहे हैं, तो आपको RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup विधि का उपयोग करना होगा।" - http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimehelpers.probeforsufficientstack.aspx – DavidO