2016-12-31 15 views
12

हम कारकों को खोजने के लिए रिकर्सन का उपयोग कर रहे हैं और स्टैक ओवरफ्लो अपवाद प्राप्त कर रहे हैं। हमने पढ़ा है कि the C# compiler on x64 computers performs tail call optimizations:पूंछ कॉल अनुकूलन क्यों नहीं हो रहा है?

जेआईटी अनुकूलित कोड चलाते समय निश्चित रूप से tailcals करता है और डीबगिंग नहीं करता है।

हमारे कार्यक्रम में अब तक इस हो जाता है चल रहा है dotnet --configuration release:

...      
7214 is a factor of 1234567890 
7606 is a factor of 1234567890 
10821 is a factor of 1234567890 
11409 is a factor of 1234567890     

Process is terminated due to StackOverflowException. 

पूंछ कॉल अनुकूलन क्यों उत्पन्न नहीं कर रहा है?

class Program 
{ 
    static void Main(string[] args) 
    { 
     const long firstCandidate = 1; 
     WriteAllFactors(1234567890, firstCandidate); 
    } 

    private static void WriteAllFactors(long number, long candidate) 
    { 
     if (number % candidate == 0) 
     { 
      System.Console.WriteLine($"{candidate} is a factor of {number}"); 
     } 

     candidate = candidate + 1; 
     if(candidate > number/2) 
     { 
      return; 
     } 

     WriteAllFactors(number, candidate); 
    } 
} 
+1

पूंछ कॉल रिकर्सन की आवश्यकता नहीं है कि आप मूल्य वापस कर दें? – zzzzBov

+0

@zzzzBov मैं अनुमान लगा रहा हूं कि यह एक अशिष्ट सवाल है। :) –

+1

कोई वापसी नहीं है; क्या यह हमेशा के लिए दौड़ने से रोकता है? –

उत्तर

3

VSadov अपने जवाब में इस बात के लिए स्पष्ट कारण प्रदान करता है:

आम तौर पर JIT जब यह है कि लाभदायक पाता पूंछ कॉल उत्सर्जन करता है।

इसके अलावा, उन्होंने राज्य के लिए पर चला जाता है:

यह एक बात यह है कि सी # में व्यक्त नहीं है। इनलाइनिंग के विपरीत, को विशेषताओं के माध्यम से मजबूर किया जा सकता है, tailcalling वर्तमान में मजबूर नहीं किया जा सकता है। अगर किसी को EmitMethodCall द्वारा उत्सर्जित कोड लिखने की आवश्यकता है, तो वह सी # का उपयोग नहीं कर सकता है।

तो जवाब यह है कि जब टेलकोल्स निश्चित रूप से उपलब्ध और उपयोग किए जाते हैं, तो भविष्यवाणी करने के लिए कोई तरीका नहीं है कि उनका उपयोग कब किया जाएगा या उन्हें सी # में उपयोग करने के लिए मजबूर किया जाएगा।

+0

मुझे आश्चर्य है कि StackOverflow अपवाद को रोकने के लिए लाभदायक नहीं है। अगर यह जवाब है, तो, यह जवाब है। –

संबंधित मुद्दे