C#:再帰的機能Lambdas
質問
以下のいないコンパイル:
Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);
ローカル変数'部分がないこと 初期化される前にアクセス
どのようにすることができますを再帰関数とlambdas?
[更新]
ここでもリンクから興味深い読み:
解決
関数のこの特定のスタイルは、単一のライン宣言としての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);