如何编写一个LINQ表达式(首选方法调用语法),它给出一个位于特定范围内的斐波那契数字列表,比如1到1000?
答案 0 :(得分:14)
行;获得更多“FP”答案:
using System;
using System.Collections.Generic;
using System.Linq;
static class Program
{
static void Main()
{
Func<long, long, long, IEnumerable<long>> fib = null;
fib = (n, m, cap) => n + m > cap ? Enumerable.Empty<long>()
: Enumerable.Repeat(n + m, 1).Concat(fib(m, n + m, cap));
var list = fib(0, 1, 1000).ToList();
}
}
请注意理论上这可以写成单个lambda,但那是very hard。
答案 1 :(得分:3)
使用来自here的iterator-block答案:
foreach (long i in Fibonacci()
.SkipWhile(i => i < 1)
.TakeWhile(i => i <= 1000)) {
Console.WriteLine(i);
}
或列表:
var list = Fibonacci().SkipWhile(i => i < 1).TakeWhile(i => i <= 1000)
.ToList();
输出:
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
答案 2 :(得分:2)
这是枚举基础解决方案。这是一个懒惰的评价。因此,当MoveNext()完成时,会生成下一个数字。
foreach (int k in Fibonacci.Create(10))
Console.WriteLine(k);
class Fibonacci : IEnumerable<int>
{
private FibonacciEnumertor fibEnum;
public Fibonacci(int max) {
fibEnum = new FibonacciEnumertor(max);
}
public IEnumerator<int> GetEnumerator() {
return fibEnum;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return GetEnumerator();
}
public static IEnumerable<int> Create(int max) {
return new Fibonacci(max);
}
private class FibonacciEnumertor : IEnumerator<int>
{
private int a, b, c, max;
public FibonacciEnumertor(int max) {
this.max = max;
Reset();
}
// 1 1 2 3 5 8
public int Current {
get {
return c;
}
}
public void Dispose() {
}
object System.Collections.IEnumerator.Current {
get { return this.Current; }
}
public bool MoveNext() {
c = a + b;
if (c == 0)
c = 1;
a = b;
b = c;
;
return max-- > 0;
}
public void Reset() {
a = 0;
b = 0;
}
}
}
答案 3 :(得分:2)
效率不高:
val fibonacci = Enumerable
.Range(0, 1000)
.Aggregate(new List<int>{1,0}, (b,j)=>{
b.Insert(0,b[0]+b[1]);
return b; });
答案 4 :(得分:1)
很晚,但是带有“yield”关键字的快速版本: - )
IEnumerable<int> Fibonacci(int limit)
{
int number = 1, old = 0;
while (number < limit)
{
yield return number;
int tmp = number; number += old; old = tmp;
}
}
var list = Fibonacci(1000).ToList();
答案 5 :(得分:0)
使用linq
打印斐波纳契的最简单方法 List<int> lst = new List<int> { 0, 1 };
for (int i = 0; i <= 10; i++)
{
int num = lst.Skip(i).Sum();
lst.Add(num);
foreach (int number in lst)
Console.Write(number + " ");
Console.WriteLine();
}