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

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

 2010-09-30 20:46:16 来源:WEB开发网   
核心提示: 希望大家对 “委托扩展” 和 “递推递归委托”提些看法,名字定义不太好,c#扩展方法奇思妙用变态篇一:由Fibonacci数列引出“委托扩展”及“递推递归委托”(4),请指正!-- 以下为追加内容--看了大家的回复,对我鼓励很大,有什么不同呢,设个

希望大家对 “委托扩展” 和 “递推递归委托”提些看法,名字定义不太好,请指正!

----------------------------------------------------------------------------------------------------------

以下为追加内容

----------------------------------------------------------------------------------------------------------

看了大家的回复,对我鼓励很大,于是我也忍不住把 装配脑袋 的算法改进了一下:

public static Func<Point, Point> f = p => { p.X += p.Y; p.Y = p.X - p.Y; return p;  };
public static Func<Point, Func<Point, Point>, int, Point> g1 = (p, f, n) =>  n > 0 ? g1(f(p), f, n - 1) : p;
public static Func<Point, Func<Point, Point>, int, Point> g2 = (p, f, n) =>  n > 0 ? f(g2(p, f, n - 1)) : new Point(0, 1);

public static void Test8()
{
    //测试 generate1
    Point p1 = g1(new Point(0, 1), f, 3);
    for (int i = 0; i < 12; i++)
        Console.WriteLine(g1(new Point(0, 1), f, i));
    //测试 generate2
    Point p2 = g2(default(Point), f, 3);
    for (int i = 0; i < 12; i++)
        Console.WriteLine(g2(default(Point), f, i));
}

这里用到Point (System.Drawing中的),因为它能包含两个整数,Fibonacci又是前两项之和,所以...

以下是调试运行的结果:

输出

{X=0,Y=1}
{X=1,Y=0}
{X=1,Y=1}
{X=2,Y=1}
{X=3,Y=2}
{X=5,Y=3}
{X=8,Y=5}
{X=13,Y=8}
{X=21,Y=13}
{X=34,Y=21}
{X=55,Y=34}
{X=89,Y=55}

{X=0,Y=1}
{X=1,Y=0}
{X=1,Y=1}
{X=2,Y=1}
{X=3,Y=2}
{X=5,Y=3}
{X=8,Y=5}
{X=13,Y=8}
{X=21,Y=13}
{X=34,Y=21}
{X=55,Y=34}
{X=89,Y=55}

两列Fibonacci,不过第二列刚开始不对。

g1和g2是两种算法,看上去很相似,有什么不同呢,设个断点单步调试(F11)下吧!

上面的代码还不够简洁,最后将f与g1合在一起,如下:

public static Func<Point, int, Point> g3 = (p, n) => n > 0 ? g3(new Point(p.X + p.Y, p.X), n - 1) : p;

测试调用代码如下:

Test9()
        public static void Test9()
        {
            //测试 generate3
            Point p3 = g3(new Point(0, 1), 3);
            for (int i = 0; i < 12; i++)
                Console.WriteLine(g3(new Point(1,0), i));
        }

几种算法的优点和缺点大家来评判吧!

上一页  1 2 3 4 

Tags:扩展 方法 奇思

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