1. 程式人生 > >拾遺:關於“尾遞歸”——tail recursive

拾遺:關於“尾遞歸”——tail recursive

邏輯 失效 個人 帶來 足夠 局限 因子 自動 lan

定義[個人理解]

  尾遞歸,即是將外層得出的常量計算因子,以函數參數的形式逐層向內傳遞,即內層調用整合外層調用的產出,整個遞歸的結果最終由最內層的一次函數調用得出;而通常的遞歸則是外層調用阻塞、等待內層調用的產出,最後由最上層的一次函數調用得出最終結果。

優執:

  適度應用,可以帶來效率的提升,同時在一定程度上提升程序的穩定性。

局限:

  效率提升取決於編譯器的優化策略,最終結果存在不確定性,即使內層調用在邏輯上已可獨立運行;

  僅可作為潛在的效率提升措施,但不能做為循環的替代,因為其不能保證 100% 避免棧溢出風險;

  現代編譯器已足夠智能,結構簡單的普通遞歸可被自動優化為尾遞歸,過度沈迷尾遞歸的結構得不償失。

示例:

  如在 clang-4.0 環境下, 本在已測試良好的尾遞歸函數中添加如下兩句,將導致尾遞歸失效,從而爆棧使程序崩潰!

int A[1024 * 1024 * 8];
printf("%p", &A);

結論:

  偶爾驚艷,但不實用,不可作為常規手段。

拾遺:關於“尾遞歸”——tail recursive