c#扩展方法奇思妙用变态篇一:由Fibonacci数列引出“委托扩展”及“递推递归委托”
2010-09-30 20:46:16 来源:WEB开发网本文是为了引出递推递归委托,暂不是算法的效率
下面就要大(改)变(形)态了。
不考虑 <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);
}
一点意见:像这样代码,最好是给封装起来,否则会很麻烦的。
这篇文章是给极少数人看的(启发一下),看完后封装好给大多数人用。这是也“变态篇”系列文章的宗旨.
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换