एक पूंछ प्रत्यावर्तन उदाहरण के साथ कर रही जबकि मैं एक सामान्य पुनरावर्ती कॉल के परिणाम और एक पूंछ पुनरावर्ती कॉल में थोड़ा अंतर देखा:मेरे सामान्य रिकर्सन और पूंछ रिकर्सन उदाहरण के बीच एक गोल अंतर क्यों है?
scala> def fact(n: Int): Double = if(n < 1) 1 else n * fact(n - 1)
fact: (n: Int)Double
scala> fact(30)
res31: Double = 2.6525285981219103E32
scala> @tailrec def fact(n: Int, acc: Double = 1): Double = if(n < 1) acc else fact(n - 1, n * acc)
fact: (n: Int, acc: Double)Double
scala> fact(30)
res32: Double = 2.652528598121911E32
बस जिज्ञासा से बाहर, किसी ने मुझे कृपया उसका वर्णन क्यों या जहां गोल हो रहा है। मेरा अनुमान है कि स्कैला कंपाइलर पूंछ रिकर्सिव संस्करण को लूप में अनुवाद करता है, acc
पैरामीटर लूप के प्रत्येक पुनरावृत्ति पर असाइन किया जाता है, और छोटी गोलिंग त्रुटि वहां फिसल जाती है।
एक उचित प्रोग्रामिंग भाषा में, जैसे स्कैला है, 'डबल' चर को 'डबल' परिणाम असाइन करने से राउंडिंग त्रुटि नहीं मिलती है। –