C#斐波那契函数返回错误
-
21-08-2019 - |
题
我在练一个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;
}
}
谁能告诉我我在做什么错在这里?
解决方案
这是击败了所有你的解决方案!
由于,为什么重复当你有聪明的数学家做的封闭形式的解决方案的吗? :)
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;
}
其他提示
下面是使用无限迭代器块一个有趣的解决方案:
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;
}
}
其实我很喜欢这样的斐波那契实现VS传统递归解决方案,因为它使用来完成可完成下一个任期的工作。传统的递归溶液复制了一些工作,因为它需要两个递归调用每个术语
问题在于<=以下语句:
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++)
嗯,首先你的阵列只有10长,你用〜100个项目加油吧(超出范围的异常) - 但也有更好的方法来做到这一点...
例如,使用此篇:
long val = ...
bool isFib = Fibonacci().TakeWhile(x => x <= val).Last() == val;
int[] fib = new int[10];
for (int i = 2; i <= *100*; i++)
您要去你的数组的边界,因为你的循环条件是太大。一个更传统的方法是将结合的环由阵列的尺寸:
for (int i = 2; i < fib.Length; i++)
和让你的阵列大,但正如马克说,有更好的方法来做到这一点,我建议你花一些时间阅读维基百科的文章上的斐波那契数。
一两件事你可以做的是检查是否有提前退出。既然你要确定给定的数字是在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;
}
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;
}
不隶属于 StackOverflow