WEB开发网
开发学院软件开发C语言 c#扩展方法奇思妙用变态篇一:由Fibonacci数列引出... 阅读

c#扩展方法奇思妙用变态篇一:由Fibonacci数列引出“委托扩展”及“递推递归委托”

 2010-09-30 20:46:16 来源:WEB开发网   
核心提示: 本文是为了引出递推递归委托,暂不是算法的效率下面就要大(改)变(形)态了,c#扩展方法奇思妙用变态篇一:由Fibonacci数列引出“委托扩展”及“递推递归委托”(3),不考虑 <1 的情况public static Func<int, int> Fibonacci = n =

本文是为了引出递推递归委托,暂不是算法的效率

下面就要大(改)变(形)态了。

不考虑 <1 的情况

public static Func<int, int> Fibonacci = n => Fibonacci(n - 1) + Fibonacci(n - 2);

与数学通项式对比一下,何其相似!这就是我们的“递推递归委托”!

考虑所有情况,完成Fibonacci,如下

public static Func<int, int> Fibonacci = n => n > 1 ? Fibonacci(n - 1) + Fibonacci(n - 2) : n;

实在感叹c#精简的语法,一句代码可以表示一个递推递归!

调用测试下吧!

        public static void Test2()
        { 
            //委托扩展方法 + 递推递归委托
            int[] fibonacciSequence = Fibonacci.GetSequence(12).ToArray();
        }

当然这个生成算法效率不是一般的低!

最后给出一个数学推导出的精确算法

        public static Func<int, int> Fibonacci2 = n => (int)(5.0.Pow(-0.5) * ((0.5 * (1 + 5.0.Pow(0.5))).Pow(n + 1) - (0.5 * (1 - 5.0.Pow(0.5))).Pow(n + 1)));
        //Pow扩展,简化调用
        public static double Pow(this double x, double y)
        {
            return Math.Pow(x, y);
        }

一点意见:像这样代码,最好是给封装起来,否则会很麻烦的。

这篇文章是给极少数人看的(启发一下),看完后封装好给大多数人用。这是也“变态篇”系列文章的宗旨.

上一页  1 2 3 4  下一页

Tags:扩展 方法 奇思

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接