C#fibonacci函数返回错误

时间:2009-07-02 18:39:21

标签: c# console-application fibonacci

我正在练习一个C#控制台应用程序,我正在尝试使用该函数来验证该数字是否出现在斐波那契系列中,但我收到了错误。

我做的是:

class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine(isFibonacci(20));
    }
    static int isFibonacci(int n)
    {
        int[] fib = new int[100];
        fib[0] = 1;
        fib[1] = 1;
        for (int i = 2; i <= 100; i++)
        {
            fib[i] = fib[i - 1] + fib[i - 2];

            if (n == fib[i])
            {
                return 1;
            }



        }
        return 0;
    }
}

有谁能告诉我这里我做错了什么?

7 个答案:

答案 0 :(得分:19)

这是一个使用无限迭代器块的有趣解决方案:

IEnumerable<int> Fibonacci()
{
   int n1 = 0;
   int n2 = 1;

   yield return 1;
   while (true)
   {
      int n = n1 + n2;
      n1 = n2;
      n2 = n;
      yield return n;
   }
}

bool isFibonacci(int n)
{
    foreach (int f in Fibonacci())
    {
       if (f > n) return false;
       if (f == n) return true;
    }
}

我实际上非常喜欢这种Fibonacci实现与传统的递归解决方案,因为它保留了用于完成下一个完成术语的工作。传统的递归解决方案复制了一些工作,因为每个术语需要两次递归调用。

答案 1 :(得分:9)

问题出在&lt; =以下声明中:

for (int i = 2; i <= 100; i++)

更重要的是=。没有fib [100](C#零计数)所以当你检查i = 100时你会得到一个例外。

正确的陈述应该是

for (int i = 2; i < 100; i++)

甚至更好

for (int i = 2; i < fib.Length; i++)

答案 2 :(得分:5)

这是一个击败你所有人的解决方案!

因为,当你有聪明的数学家为你做封闭式解决方案时,为什么迭代? :)

static bool IsFibonacci(int number)
{
    //Uses a closed form solution for the fibonacci number calculation.
    //http://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression

    double fi = (1 + Math.Sqrt(5)) / 2.0; //Golden ratio
    int n = (int) Math.Floor(Math.Log(number * Math.Sqrt(5) + 0.5, fi)); //Find's the index (n) of the given number in the fibonacci sequence

    int actualFibonacciNumber = (int)Math.Floor(Math.Pow(fi, n) / Math.Sqrt(5) + 0.5); //Finds the actual number corresponding to given index (n)

    return actualFibonacciNumber == number;
}

答案 3 :(得分:4)

嗯,对于初学者来说,你的阵列只有10个长,而你正在填充~100个项目(超出范围的例外) - 但有更好的方法来做到这一点......

例如,使用this post

long val = ...
bool isFib = Fibonacci().TakeWhile(x => x <= val).Last() == val;

答案 4 :(得分:2)

您可以做的一件事是检查提前退出。由于您正在尝试确定给定的数字是否在Fibonacci序列中,您可以进行边界检查以提前退出。

示例:

static bool isFibonacci(int n)
{
    int[] fib = new int[100];
    fib[0] = 1;
    fib[1] = 1;
    for (int i = 2; i <= fib.Length; i++)
    {
        fib[i] = fib[i - 1] + fib[i - 2];

        if (n == fib[i])
        {
            return true;
        }
        else if (n < fib[i])
        {
            return false;  //your number has been surpassed in the fib seq
        }
    }
    return false;
}

答案 5 :(得分:2)

int[] fib = new int[10];
for (int i = 2; i <= *100*; i++)

你的数组范围已经超出范围,因为你的循环条件太大了。更传统的方法是将循环绑定到数组的大小:

for (int i = 2; i < fib.Length; i++)

让你的阵列更大,但正如Marc所说,有更好的方法可以做到这一点,我建议你花一些时间阅读Fibonacci numbers上的维基百科文章。

答案 6 :(得分:1)

public static int FibNo(int n) {
    int result = 0; int No = 0; int N1 = 1;

    if (n< 0)
    { throw new ArguementException("number must be a positive value"); }

    if (n <= 1) 
    { result = n; return result; }

    for(int x=1; x < n; x++) 
    { result = No + N1; No = N1; N1=result; }

    return result;

}