मैंने जीसीसी 4.8.1 और क्लैंग 3.4.190255 दोनों के साथ कई अनुकूलन स्तरों पर असेंबली आउटपुट की जांच की है, इस तरह के कोड के लिए कोई पूंछ कॉल अनुकूलन नहीं है।क्या यह पूंछ कॉल अनुकूलित हो सकता है? यदि हां, तो इसके लिए विशेष कारण क्या नहीं है?
collatz_aux
कोई विशेष कारण क्यों पूंछ कॉल अनुकूलन नहीं मिलता है?
#include <vector>
#include <cassert>
using namespace std;
vector<unsigned> concat(vector<unsigned> v, unsigned n) {
v.push_back(n);
return v;
}
vector<unsigned> collatz_aux(unsigned n, vector<unsigned> result) {
return n == 1
? result
: n % 2 == 0
? collatz_aux(n/2, concat(move(result), n))
: collatz_aux(3 * n + 1, concat(move(result), n));
}
vector<unsigned> collatz_vec(unsigned n) {
assert(n != 0);
return collatz_aux(n, {});
}
int main() {
return collatz_vec(10).size();
}
संबंधित है, शायद नकल: http://stackoverflow.com/questions/17792887/can- tail-call-optimization-and-raii-co-exist – jrok
मैं वास्तव में 'concat' फ़ंक्शन के बिंदु को समझ नहीं पा रहा हूं। यदि आप बस एक इटरेटर का उपयोग करते हैं तो यह काफी सरल होगा (और शायद पूंछ रिकर्सन सक्षम करें)। असल में, जब मैं कोशिश करता हूं, तो यह स्पष्ट करता है कि कोड को आसानी से कैसे लिखा जा सकता है। –
इटरेटर संस्करण: http://coliru.stacked-crooked.com/a/24bd251ace479632 –