सही उत्तर यह है कि यह फ़ंक्शन सभी पूर्णांकों के लिए समाप्त नहीं होता है (विशेष रूप से, यह -1 पर समाप्त नहीं होता है)। आपका दोस्त यह बताते हुए सही है कि यह स्यूडकोड है और स्यूडोकोड एक स्टैक ओवरफ्लो पर समाप्त नहीं होता है। स्यूडोकोड को औपचारिक रूप से परिभाषित नहीं किया गया है, लेकिन विचार यह है कि यह वही करता है जो टिन पर कहता है। यदि कोड यह नहीं कहता है कि "स्टैक ओवरफ़्लो त्रुटि के साथ समाप्त हो" तो स्टैक ओवरफ़्लो त्रुटि नहीं है।
यहां तक कि अगर यह एक वास्तविक प्रोग्रामिंग भाषा थी, तब भी सही उत्तर "समाप्त नहीं होता है", जब तक कि स्टैक का उपयोग भाषा की परिभाषा का हिस्सा न हो। अधिकांश भाषाएं उन कार्यक्रमों के व्यवहार को निर्दिष्ट नहीं करती हैं जो स्टैक को ओवरफ्लो कर सकते हैं, क्योंकि यह जानना मुश्किल है कि प्रोग्राम कितने स्टैक का उपयोग करेगा।
यदि वास्तविक दुभाषिया या कंपाइलर पर कोड चलाने से कई भाषाओं में स्टैक ओवरफ्लो होता है, तो यह भाषा के औपचारिक शब्दार्थ और कार्यान्वयन के बीच की विसंगति है। यह आमतौर पर समझा जाता है कि किसी भाषा का कार्यान्वयन केवल वही करेगा जो परिमित मेमोरी के साथ एक ठोस कंप्यूटर पर किया जा सकता है। यदि प्रोग्राम स्टैक ओवरफ्लो के साथ मर जाता है, तो आप एक बड़ा कंप्यूटर खरीदने वाले हैं, सिस्टम को फिर से इकट्ठा करें यदि आवश्यक हो तो सभी मेमोरी का समर्थन करें, और फिर से प्रयास करें। यदि प्रोग्राम नॉन-टर्मिनेटिंग है तो आपको ऐसा हमेशा करते रहना होगा।
यहां तक कि तथ्य यह है कि एक प्रोग्राम स्टैक को ओवरफ्लो करेगा या नहीं करेगा, इसे अच्छी तरह से परिभाषित नहीं किया गया है, क्योंकि कुछ अनुकूलन जैसे कि पूंछ कॉल ऑप्टिमाइज़ेशन और मेमोइज़ेशन , निरंतर-बाउंड स्टैक स्पेस में फ़ंक्शन कॉल की अनंत श्रृंखला की अनुमति दे सकते हैं। कुछ भाषा विनिर्देश भी जनादेश देते हैं कि कार्यान्वयन संभव होने पर टेल कॉल ऑप्टिमाइज़ेशन करते हैं (यह कार्यात्मक प्रोग्रामिंग भाषाओं में आम है)। इस समारोह के लिए, f(-1)
विस्तार करने के लिए f(f(-2))
; बाहरी कॉल f
एक टेल कॉल है, इसलिए यह स्टैक पर कुछ भी धक्का नहीं देता है, इस प्रकार केवल f(-2)
स्टैक पर चला जाता है, और वह वापस आ जाता है -1
, इसलिए स्टैक वापस उसी स्थिति में होता है जो शुरुआत में था। इस प्रकार टेल कॉल ऑप्टिमाइजेशन के साथ f(-1)
निरंतर मेमोरी में हमेशा के लिए लूप हो जाता है।