3 回答

TA貢獻1820條經(jīng)驗 獲得超3個贊
C ++中的尾部注釋看起來與C或任何其他語言相同。
void countdown( int count ) {
if ( count ) return countdown( count - 1 );
}
尾遞歸(通常是尾調(diào)用)要求在執(zhí)行尾調(diào)用之前清除調(diào)用者的堆棧幀。對程序員而言,尾遞歸類似于循環(huán),return簡化為goto first_line;。但是,編譯器需要檢測您在做什么,如果沒有,則仍然會有一個額外的堆棧幀。大多數(shù)編譯器都支持它,但是編寫循環(huán)或goto通常更容易且風險更低。
非遞歸尾調(diào)用可以啟用隨機分支(類似于goto其他函數(shù)的第一行),這是一種更為獨特的功能。
請注意,在C ++中,return語句范圍內(nèi)不能有任何帶有非平凡析構(gòu)函數(shù)的對象。功能結(jié)束清理將要求被呼叫者返回到呼叫者,從而消除尾叫。
還要注意(以任何語言),尾部遞歸要求算法的整個狀態(tài)在每一步都通過函數(shù)參數(shù)列表傳遞。(從下一個調(diào)用開始之前就必須消除函數(shù)的堆??蚣艿囊笾锌梢郧宄乜闯鲞@一點……您不能將任何數(shù)據(jù)保存在局部變量中。)此外,在函數(shù)的返回值返回尾部之前,不能對其進行任何操作。
int factorial( int n, int acc = 1 ) {
if ( n == 0 ) return acc;
else return factorial( n-1, acc * n );
}
- 3 回答
- 0 關注
- 556 瀏覽
添加回答
舉報