2011-12-17 80 views
1

.net編譯器是否知道從下面的代碼中產生尾遞歸? (這意味着它知道沒有回溯應作出,因爲&&的,?)是否足夠用於尾遞歸?

public bool DeleteLocation(Guid locationId) 
{ 

    return ((_mLocationDal.Save(locationRes) != null) && 
      locationRes.ChildrenIds.Aggregate(true, 
         (succeededSoFar, next) => succeededSoFar && 
                DeleteLocation(next))); 
} 
+0

這可能是一個有趣的問題,但所有的答案到目前爲止似乎是一個事實,固定的*編譯器*不執行這些操作,而是CLR的JIT編譯器。如果這就是你問的問題,你應該考慮編輯這個問題來刪除對編譯器的錯誤引用。 – 2011-12-17 11:34:29

回答

1

布爾表達式懶洋洋地評估;例如在A && B中,如果A爲假,則從不評估B。這就是爲什麼像if (thing != null && thing.DoSomething())這樣做是安全的。

1

C#編譯器根本不支持尾遞歸,如果用「tail」表示用CIL的.tail前綴調用方法,它不會在棧上留下幀。

2

即使C#編譯器支持尾遞歸優化(它沒有),它將不會在您的程序中檢測到它,因爲DeleteLocation不會直接調用它自己。它使用的函數調用DeleteLocation,但這不足以優化遞歸尾部調用。

在一個側面說明,All提供你的情況爲Aggregate更緊湊的更換:

public bool DeleteLocation(Guid locationId) { 
     return (_mLocationDal.Save(locationRes) != null) && 
      locationRes.ChildrenIds.All(next => DeleteLocation(next)); 
    }