c#扩展方法奇思妙用变态篇一:由Fibonacci数列引出“委托扩展”及“递推递归委托”
2010-09-30 20:46:16 来源:WEB开发网希望大家对 “委托扩展” 和 “递推递归委托”提些看法,名字定义不太好,请指正!
----------------------------------------------------------------------------------------------------------
以下为追加内容
----------------------------------------------------------------------------------------------------------
看了大家的回复,对我鼓励很大,于是我也忍不住把 装配脑袋 的算法改进了一下:
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));
}
几种算法的优点和缺点大家来评判吧!
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换
更多精彩
赞助商链接