重构Fibonacci算法

我多年没有使用过静态类型的语言,并且自己设定了使用C#加快速度的任务。 我正在使用我常用的技巧来完成15个练习http://www.jobsnake.com/seek/articles/index.cgi?openarticle&8533作为我的第一个任务。

我刚刚完成了第二次Fibonacci任务,这项任务并没有花费很长时间并且运行得很好,但在我看来看起来很丑陋,而且我确信可以用更少的优雅代码来实现。

我通常喜欢通过与已经知道他们正在做什么的人进行结对编程来学习,但是这个选项今天对我不开放,所以我希望在这里发帖将是下一个最好的事情。

所以对于所有C#Jedi来说,如果你要重构下面的代码,它会是什么样子?

using System; using System.Collections; namespace Exercises { class MainClass { public static void Main(string[] args) { Console.WriteLine("Find all fibinacci numbers between:"); int from = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("And:"); int to = Convert.ToInt32(Console.ReadLine()); Fibonacci fibonacci = new Fibonacci(); fibonacci.PrintArrayList(fibonacci.Between(from, to)); } } class Fibonacci { public ArrayList Between(int from, int to) { int last = 1; int penultimate = 0; ArrayList results = new ArrayList(); results.Add(penultimate); results.Add(last); while(lastfrom && fib<to) results.Add(fib.ToString()); } return results; } public void PrintArrayList(ArrayList arrayList) { Console.WriteLine("Your Fibonacci sequence:"); Console.Write(arrayList[0]); for(int i = 1; i<arrayList.Count; i++) { Console.Write("," + arrayList[i]); } Console.WriteLine(""); } } } 

问候,

克里斯

作为迭代器块:

 using System; using System.Collections.Generic; using System.Linq; static class Program { static IEnumerable Fibonacci() { long n = 0, m = 1; yield return 0; yield return 1; while (true) { long tmp = n + m; n = m; m = tmp; yield return m; } } static void Main() { foreach (long i in Fibonacci().Take(10)) { Console.WriteLine(i); } } } 

现在这完全是懒惰的,使用LINQ的Skip / Take等可以让你轻松控制开始/结束。 例如,对于您的“之间”查询:

 foreach (long i in Fibonacci().SkipWhile(x=>x < from).TakeWhile(x=>x <= to)) {...} 

如果您更喜欢递归而不是循环:

 public static void Main(string[] args) { Func fib = null; fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n; int start = 1; int end = 10; var numbers = Enumerable.Range(start, end).Select(fib); foreach (var number in numbers) { Console.WriteLine(number); } } 

我会将IEnumerable类型更改为IEnumerable因为它将从50开始溢出

对于那些没有像我一样屈服于Linq-ed的人,“简单杰克”版本。 我被禁止离开绝地俱乐部;)

 static List GetAllFibonacciNumbersUpto(int y) { List theFibonacciSeq = new List(); theFibonacciSeq.Add(0); theFibonacciSeq.Add(1); int F_of_n_minus_2 = 0; int F_of_n_minus_1 = 1; while (F_of_n_minus_2 <= y) { theFibonacciSeq.Add(F_of_n_minus_1 + F_of_n_minus_2); F_of_n_minus_2 = F_of_n_minus_1; F_of_n_minus_1 = theFibonacciSeq.Last(); } return theFibonacciSeq; } 

现在我们已经把它排除在外……

 // read in some limits int x = 0; int y = 6785; foreach (int iNumber in GetAllFibonacciNumbersUpto(y).FindAll(element => (element >= x) && (element <= y))) Console.Write(iNumber + ","); Console.WriteLine();