2013-03-01 84 views
0

可以使用boost :: lambda 遞歸Boost lambda遞歸?

這並不編譯:

using namespace boost::lambda; 

auto factorial = (_1 == 0) ? 1 : factorial(_1-1); 

是否有建議的解決方法?

編輯:關於使用C++ 11 lambda表達式:下面的VS2012不能編譯:

std::function<int(int)> factorial; 
factorial = [&factorial](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); }; 

int main(int argc, char* argv[]) 
{ 
    int i = factorial(5); 
return 0; 
} 

ANOTHER編輯:奇怪的是,這一個正常工作:

std::function<int(int)> factorial = 
    [&](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); }; 

int main(int argc, char* argv[]) 
{ 
    int i = factorial(5); 
return 0; 
} 
+1

如果您已經使用C++ 11,爲什麼不使用'std :: function'和一個內置的遞歸lambda? http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c0x – 2013-03-01 18:47:53

+0

boost :: lambda似乎有點穩定和靈活,然後msvc C++ 11 lambda實現... – 2013-03-01 18:53:01

+0

什麼問題您是否正在使用lambda表達式的VC++實現?我已經使用它們很多,沒有看到任何問題(好吧,自SP1以來沒有問題)。 – Ferruccio 2013-03-01 18:57:23

回答

0

最簡單的方法我用常規的C++ 11 lambda表達式發現的是聲明將首先包含lambda的變量,然後定義它並創建lambda表達式。已經聲明允許聲明在定義/ lambda本身中使用。例如:

std::function<int (int)> factorial = nullptr; 
factorial = [](int x) -> int { 
    if (x <= 1) { 
     return 1; 
    } else { 
     return (x * factorial(x-1)); 
    } 
}; 

到目前爲止,我還沒有與該方法的任何問題,但你必須知道聲明的簽名,我不知道是否與工作的boost ::拉姆達(我會這樣假設?)。

+0

這不是遞歸的;如果你這樣做,它不會編譯(VS2012) – 2013-03-01 19:56:04

+0

這個例子不是,我會解決這個問題。它(或類似的東西,我沒有訪問一個合適的編譯器atm)肯定會編譯,我經常使用它。 – ssube 2013-03-01 22:09:41

1

Lambda函數不能直接調用自己,因爲它們沒有名稱。

解決方法很簡單:使用命名函數。

+0

不完全正確 - 如果要獲取lambda函數指針的基地址,理論上可以將其轉換爲適當的類型,然後將其稱爲遞歸。雖然可能不值得花錢。 – 2013-03-01 18:52:16