2014-01-23 82 views
1

我知道遞歸尾調用是函數調用自己作爲其最後一個操作的時候。即使函數調用不在最後一行,以下內容也會被視爲尾部調用嗎?這是否被視爲尾部呼叫?

void test(int a) 
{ 
    if(a == 1) 
     return; 
    else if(a % 2 == 0) 
     test(a/2); 
    else 
     test(3 * a - 1); 
} 

說一個是偶數。將呼叫測試(a/2)視爲尾聲呼叫?

+1

對'test'的調用發生在[tail call](http://en.wikipedia.org/wiki/Tail_call)位置。基本上任何被調用爲* last操作的函數* - 這意味着返回值必須被丟棄或立即返回[但當然這些不適用於'void'] - 處於尾部調用位置。 – user2864740

回答

2

是的,這並不是說在C++中意義重大。 C++不需要尾部調用消除;編譯器有時可以做到,但他們通常不會。你不能像Scheme中那樣依賴它。

+0

但是,如果編譯器確實調用了尾部調用消除,則應該爲此函數執行此操作。 – Barmar

+0

@Barmar:這有點強。尾部呼叫優化器只能在具有一個分支和一個尾部呼叫的功能上工作並不是不合理的。問題是,認識到TCO的機會需要流量分析,流量分析通常具有指數級的複雜性。 – MSalters