scala - Why is this tail recursive? -


इस स्कला-कोड को देखें:

  def rec (n: int) {if (N & gt; 1) {val d = n / 2 rec (d) // यदि (d & gt; 1) // abort लूप rec (n / d)}}   

यह कोड का परिणाम अंतहीन लूप में होगा। पूंछ पुनरावृत्ति अनुकूलन के कारण मुझे स्टैक ओवरफ्लो त्रुटि नहीं मिलती।

जेड के साथ डीकंपल किया गया मुझे यह जावा-कोड मिला:

  सार्वजनिक रिक रिक (इंट एन) {int d ; (; N & gt; 1; n / = d) के लिए {int i = n; डी = आई / 2; आरईसी (घ); }}   

पाश की आखिरी पंक्ति में विधि खुद कहलाता है इसलिए मैं पूंछ कॉल की स्थिति को समझ नहीं पा रहा हूं। जो कोई यह समझा सकता है

आरईसी (डी) के मामले में कोई पूंछ कॉल नहीं है log (N) (जहां N & gt; 1 ) के लिए log2 (N) कॉल के बाद अब और नहीं बढ़ता (क्योंकि उसके बाद < कोड> एन 2 या 3 के बराबर है, और d 1 है)। उसके बाद यह केवल आंतरिक आरईसी (1) कॉल के साथ अनंत लूप है जो तुरंत हर बार रिटर्न देता है यही कारण है कि वहाँ अतिप्रवाह ढेर नहीं है।

Comments