作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经很多年没有使用静态类型的语言了,我给自己设定了一个任务,那就是快速掌握 C#。我在这里使用我惯用的技巧来完成十五个练习 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(last<to)
{
int fib = last + penultimate;
penultimate = last;
last = fib;
if (fib>from && 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("");
}
}
}
问候,
克里斯
最佳答案
作为迭代器 block :
using System;
using System.Collections.Generic;
using System.Linq;
static class Program {
static IEnumerable<long> 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
等可以让您轻松控制开始/结束。例如,对于您的“between”查询:
foreach (long i in Fibonacci().SkipWhile(x=>x < from).TakeWhile(x=>x <= to)) {...}
关于c# - 重构斐波那契算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406446/
我是一名优秀的程序员,十分优秀!