我有一個遞歸函數,我想做尾遞歸。我的實際問題更復雜並且與上下文有關。但我想解決的問題是用這個簡單的程序來演示的:對象的尾遞歸
#include <iostream>
struct obj
{
int n;
operator int&() { return n; }
};
int tail(obj n)
{
return tail(obj{ n + 1 > 1000 ? n - 1000 : n + 1 });
}
int main()
{
tail(obj{ 1 });
}
這似乎是自然的,這是尾遞歸。但它不是,因爲每次都需要調用obj n
的析構函數。至少MSVC13(編輯:) 和MSVC15不會優化此。如果我用int替換obj
並相應地更改調用,它將按預期變爲尾遞歸。
我的實際問題是:是否有一種簡單的方法可以將這個尾遞歸分開,只需將obj
替換爲int
?我的目標是獲得性能優勢,因此使用堆分配內存和new
最有可能沒有幫助。
最簡單的方法:獲得更好的編譯器,無論如何你已經過時了...... –
msvc15不會這樣做,要麼 – IceFire
你如何期待這個尾遞歸終止? –