1. ホーム
  2. c++

[解決済み] ラムダ関数は再帰的か?重複

2023-06-14 23:40:39

質問

重複の可能性があります。

c++0x における再帰的ラムダ関数

以下はごく普通の再帰関数です。

int fak(int n)
{
    return (n <= 1) ? 1 : n * fak(n - 1);
}

このような再帰的な関数をラムダ関数として書くにはどうしたらよいでしょうか。

[](int n) { return (n <= 1) ? 1 : n * operator()(n - 1); }
// error: operator() not defined

[](int n) { return (n <= 1) ? 1 : n * (*this)(n - 1); }
// error: this wasn't captured for this lambda function

現在のラムダを再帰的に呼び出せるような式はありますか?

どのように解決するのですか?

はい、できます。変数に格納し、その変数を参照することができます(ただし、その変数の型は auto と宣言することはできませんが、その場合は std::function オブジェクトを使わなければなりません。) 例えば

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

それ以外の場合、いいえ、あなたは this のポインタをラムダ本体の内部から参照することはできません。