기능적 C#을 배우려고 시도했지만 Dustin Campbell의 fibonacci example을 C# 3에 이식했습니다. 내 솔루션 작동하지만 Nth_Fib 마지막 줄을 이해하는 데 문제가 있습니다. 수식에 대한 악기가 중요하지 않은 것은 이상하지 않습니까? n은 "fn => Nth_Fib (n - 1) + Nth_Fib (n - 2)"표현식에 즉시 바인드되지만 Func 에 대한 반환 유형을 Func <으로 변경할 수 없습니다. 이것은 나중에 중복 된 인수를 전달해야 함을 의미합니까?C# 클로저를 사용하여이 fibonacci 예제를 이해할 수 있습니까?
참고 : 테스트는
[TestFixture]
public class TestFibClosure{
[Test]
public void test_fib(){
Assert.AreEqual(8, new FibClosure().Nth_Fib(5));
Assert.AreEqual(1597, new FibClosure().Nth_Fib(16));
}
}
public class FibClosure{
private Func<int, int>[] formulaCache;
public int Nth_Fib(int n){
if (n <= 2) return n;
if(formulaCache == null) formulaCache = new Func<int, int>[(n + 1)];
Func<int, int> formula = build(n);
//doesn't matter, n is already bound !! ??
return formula(334567);//same as formula(n)
}
private Func<int, int> build(int n){
if (formulaCache[n] == null)
formulaCache[n] = (fn => Nth_Fib(n - 1) + Nth_Fib(n - 2));
return formulaCache[n];
}
}
음 폐쇄? – PeanutPower
@PeanutPower : 예 - 그것들은 어떻습니까? –
@Jon 익명 메소드가 아닌 C#에서 진정한 클로저를 생성 할 수 있습니까? – PeanutPower