打印高达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();
}

打印高达15000 C#的斐波那契数

为了好玩,我想用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代码转换为使用尾部递归。

您的程序中有两个主要错误:

  1. 多次使用main((
  2. fibonacci_recrasive并没有创建,尽管它是在程序开始时声明的