私はテール再帰的にする再帰関数を持っています。私の実際の問題は、より複雑で文脈に依存しています。しかし、私は解決したい問題は、この単純なプログラムで実証されていますオブジェクトによるテール再帰
#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はこれを最適化しません。 obj
をintに置き換え、それに応じて呼び出しを変更すると、期待どおりにテール再帰的になります。
私の実際の質問は、obj
をint
に置き換えるだけで、これを末尾再帰的にする簡単な方法はありますか?私はパフォーマンスのメリットを狙っているので、ヒープ割り当てメモリとnew
で遊んでいるのは、ほとんど役に立ちません。
最も簡単な方法:あなたのものは古くなっています... –
msvc15はそれもしません – IceFire
このテール再帰がどのように終了すると思いますか? –