Sprawdziłem dane wyjściowe zespołu na wielu poziomach optymalizacji z gcc 4.8.1 i clang 3.4.190255, bez optymalizacji połączeń ogonowych dla tego rodzaju kodu.Czy to może być optymalizacja połączenia z ogonem? Jeśli tak, jaki jest tego specjalny powód?
Czy istnieje jakiś szczególny powód, dla którego collatz_aux
nie otrzymuje optymalizacji połączeń?
#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();
}
pokrewne, może powielać: http://stackoverflow.com/questions/17792887/can- tail-call-optimization-and-raii-co-exist – jrok
Naprawdę nie rozumiem punktu funkcji "concat". Byłoby to znacznie prostsze (i prawdopodobnie umożliwiłoby rekursję ogonową), gdybyś po prostu użył iteratora. W rzeczywistości, kiedy próbuję, to pokazuje, jak łatwo można przepisać kod. –
Wariant Iterator: http://coliru.stacked-crooked.com/a/24bd251ace479632 –