質問

以下のいないコンパイル:

Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);

ローカル変数'部分がないこと 初期化される前にアクセス

どのようにすることができますを再帰関数とlambdas?

[更新]

ここでもリンクから興味深い読み:

  1. エリック-Lippertのになるように再帰的ラムダが明確な課題。"
  2. 匿名の再帰クライアントまで、フルのC#
役に立ちましたか?

解決

関数のこの特定のスタイルは、単一のライン宣言としてのC#でサポートされていません。あなたが2行に宣言と定義を分離する必要があります。

Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);

他のヒント

もぉまあ、あればあなただけの「なぜ再帰的なラムダは明確な割り当てエラーを引き起こすのか?」と入力したいですいくつか検索エンジンに、あなたは、件名に私の記事で答えを見つけたと思います。

: - )

<のhref = "http://blogs.msdn.com/ericlippert/archive/2006/08/18/why-does-a-recursive-lambda-cause-a-definite-assignment-error.aspx" REL = "noreferrer"> http://blogs.msdn.com/ericlippert/archive/2006/08/18/why-does-a-recursive-lambda-cause-a-definite-assignment-error.aspx

あなたは(それが複数の割り当てに依存しているため、かなり官能化されてないです)後でそれを割り当てるかそこらのhref = "http://blogs.msdn.com/wesdyer/archive/ <呼ばれる使用fac最初ウントを作成する必要があります2007/02/02 /匿名-再帰インc.aspx」のrel = "nofollowをnoreferrer"> Y-combinators でます。

例:

delegate Func<TIn, TOut> FixedPointFunction<TIn, TOut>(Func<TIn, TOut> f);

static Func<T, TRes> Fix<T, TRes>(FixedPointFunction<T, TRes> f) {
    return f(x => Fix(f)(x));
}

static void Main(string[] args) {

    var fact = Fix<int, int>(f => x => (x <= 1) ? x : x * f(x - 1));

    Console.WriteLine(fact(5));            
}

しかし、これは理解/読み多少難しいかもしれないことに注意します。

以来、C#7.0、あなたは最終的にの の<のhref = "https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/を使用して1行でこれを行うことができますクラス-と、構造体/ローカル関数」のrel = "nofollowをnoreferrer">ローカル関数の

int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top