打印高达15000 C#的斐波那契数
本文关键字:高达 15000 打印 | 更新日期: 2023-09-27 18:16:11
我也看到过类似的问题(但在C中(——关于我的问题,在C中递归计算斐波那契数。
我有点纠结于如何在控制台应用程序中的C#中继续打印fibonacci数字,直到它达到40000左右,我该如何实现这一点?
E.G,我想让应用程序这样做:
0
1
1
2
3
5
8
and so on.
谢谢。我不想这么说,但我灵机一动,解决了它!
以下是我所做的:
static void Main(string[] args)
{
int num1 = 0;
int num2 = 1;
int sum = 1;
while (num1 <= 15000)
{
sum = num1 + num2;
num1 = num2;
num2 = sum;
Console.WriteLine(num2);
}
Console.ReadLine();
}
为了好玩,我想用LINQ扩展方法和生成器(无限序列(来实现这一点:
// A utility class that holds math utility functions.
public static class MathUtility
{
// This method returns the fibonacci sequence which is an
// infinite sequence of numbers where each result is the
// sum of the previous two results.
public static IEnumerable<int> GetFibonacciSequence()
{
int first = 0;
int second = 1;
// first and second result are always 1.
yield return first;
yield return second;
// this enumerable sequence is bounded by the caller.
while(true)
{
int current = first + second;
yield return current;
// wind up for next number if we're requesting one
first = second;
second = current;
}
}
}
这会生成一个无限(理论上(序列(如果您让它超过int的范围,它最终会溢出(。
然后您可以拨打:
foreach(var num in MathUtility.GetFibonacciSequence().TakeWhile(num => num <= 40000))
{
Console.WriteLine(num);
}
通过这种方式,您的演示(输出(与数据生成是分开的。
有一个循环的东西怎么样?类似:
static void main()
{
int num1 = 0;
int num2 = 1;
int sum = 1;
Console.WriteLine(num1);
while (sum < 40000)
{
sum = num1 + num2;
num1 = num2;
num2 = sum;
Console.WriteLine(num2);
}
}
static int Fibonacci(int n)
{
if(n <= 1) return n;
else return Fibonacci(n - 1) + Fibonacci(n - 2);
}
static void PrintAllFibonacci()
{
int n = 0;
while(true)
Console.WriteLine(Fibonacci(n++));
}
编辑:
使用堆叠的不同方法
static ulong Fibonacci(int n, IList<ulong> stack)
{
ulong fibonacci;
if (n <= 1)
{
fibonacci = (ulong)n;
}
else
{
ulong n1, n2;
if (n < stack.Count)
n1 = stack[n - 1];
else
n1 = Fibonacci(n - 1, stack);
if (n - 1 < stack.Count)
n2 = stack[n - 2];
else
n2 = Fibonacci(n - 2, stack);
fibonacci = n1 + n2;
}
if (n >= stack.Count)
stack.Add(fibonacci);
return fibonacci;
}
static void PrintAllFibonacci()
{
var stack = new List<ulong>();
var n = 0;
while(n < 50)
Console.WriteLine(n + ") " + Fibonacci(n++, stack));
}
你不能递归地这样做-记住,每个方法调用都使用你的堆栈。谷歌关于,嗯,堆栈溢出:(
你需要找到算法的迭代版本,它在互联网上随处可见。当然,虽然fib数字很快就会上升,但不可能永远输出。
使用闭式解决方案
public static long ClosedFormFibonacci(int i)
{
const double phi = 1.61803398874989; // or use your own or calculate it
const double sqrt5 = 2.23606798; // same as above
return (long)Math.Round(Math.Pow(phi, i) / sqrt5);
}
看起来它在第92个斐波那契数处溢出了一个长值
C#不容易支持尾部递归,因此使用简单的递归算法会导致足够多的堆栈溢出。对于这个问题,使用循环而不是递归是最简单的。如果你真的沉迷于递归,这里有一篇博客文章,研究了伪造递归和将C#生成的IL代码转换为使用尾部递归。
您的程序中有两个主要错误:
- 多次使用main((
- fibonacci_recrasive并没有创建,尽管它是在程序开始时声明的