C#中的Fibonacci序列错误

时间:2013-11-16 21:00:49

标签: c# loops while-loop sequence fibonacci

我最近开始学习C#(学过其他语言),我正在尝试使用while循环创建一个生成fibonacci序列到'nth'项的函数,然后返回'nth'的值术语。 我目前的代码是:

    void fibonacci(int n)
    {
        int[] terms = { 0, 1 };
        int i = 2;

        while (i<=n)
        {
            terms.Concat( terms[i-1] + terms[i-2] );
            i += 1;
        }

        return terms[n];
    }

我对C#的理解非常糟糕,因为visual studio告诉我我不能在int []中使用'Concat' - 我正在尝试使用新值附加数组。任何帮助都会很棒。

8 个答案:

答案 0 :(得分:4)

C#中的数组是固定长度的。

如果您想使用可变长度集合,请使用强类型List<T>代替Add方法:

int fibonacci(int n)
{
    var terms = new List<int>{ 0, 1 };
    int i = 2;

    while (i<=n)
    {
        terms.Add( terms[i-1] + terms[i-2] );
        i += 1;
    }

    return terms[n];
}

答案 1 :(得分:1)

您无法附加到数组。在.Net中,数组具有恒定的大小,您无法在创建后调整它们的大小。

相反,您应该使用List<int>及其Add() method

答案 2 :(得分:1)

您可以使用列表并将代码更改为:

    int fibonacci(int n)
    {
        List<int> terms = new List<int> { 0, 1 };
        int i = 2;

        while (i<=n)
        {
            terms.Add(terms[i-1] + terms[i-2]);
            i += 1;
        }

        return terms[n];
    }

答案 3 :(得分:0)

您无法向数组添加项目,因为它具有固定长度。使用List<int>代替数组

答案 4 :(得分:0)

不要将值附加到数组。数组具有静态大小,您无法在创建后调整它们的大小。  使用

 List<int> and its Add() method instead of array.

这是您对斐波那契系列的解决方案。

int fibonacci(int n)
{
    var terms = new List<int>{ 0, 1 };
    int i = 2;

    while (i<=n)
    {
        terms.Add( terms[i-1] + terms[i-2] );
        i += 1;
    }

    return terms[n];
}

也可以这样做:

class FibonacciSeries
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enter a num till which you want fibonacci series : ");
        int val = Convert.ToInt32(Console.ReadLine());
        int num1, num2;
        num1 = num2 = 1;
        Console.WriteLine(num1);
        if (val > num2)
        {
            while (num2 < val)
            {
                Console.WriteLine(num2);
                num2 += num1;
                num1 = num2 - num1;
            }
        }

        Console.ReadLine();
    }
}
这里的数组格式是

解决方案

public int[] FibonacciSeriesArray(int num)
{
     int[] arr = new int[num+1];
     arr[0] = 0;
     arr[1] = 1;

     for (int startnum = 2; startnum  <= num; startnum++)
     {
        arr[startnum] = arr[startnum - 1] + arr[startnum - 2];
     }
     return arr;
 }

答案 5 :(得分:0)

我很惊讶没有人提到修复数组大小。

好吧,也许我错过了什么,但你可以做到:

int[] FibonacciArray(int n)
{
    int[] F = new int[n+1];
    F[0] = 0;
    F[1] = 1;

    for (int i = 2; i <= n; ++i)
    {
        F[i] = F[i - 1] + F[i - 2];
    }

    return F;
}

平均比使用列表的版本快2.5倍

但通常没有免费午餐:缺点是你的内存消耗没有平滑:你需要预先支付你需要的所有内存。

答案 6 :(得分:0)

这是一种更有效的方法来寻找斐波那契数字。

enter image description here

    public static IEnumerable<double> FibList(int n)
    {
        for (int i = 1; i <= n; i++)
        {
            yield return Math.Round(Fib(i));
        }
    }

    public static double Fib(double n)
    {
        double golden = 1.61803398875;

        return (n == 0 || n == 1) ? 1 : (Math.Pow(golden, n) - Math.Pow(-golden, -n))/Math.Sqrt(5);
    }

答案 7 :(得分:0)

我会将其作为递归,而不是循环。

private static int fibonacci(int fib)
    {
        if (fib == 2 || fib == 1)
        {
            return 1;
        }
        else
        {
            return fibonacci(fib - 1) + fibonacci(fib - 2);
        }
    }