我需要编写一个递归检查数字是否是斐波那契数的程序;迭代地完成同样的任务很容易;也很容易递归地找到第n个斐波纳契数,但我仍然坚持如何使用递归检查数字是否为斐波那契数。 这是找到第n个fib的代码。号:
int fib(int n){
if (n <= 1){
return n;
}else {
return (fib(n-1) + fib (n-2));
}
}
我不知道怎么做是如何修改上面的代码来检查给定的数字是否是斐波那契?
答案 0 :(得分:4)
传统方式是使用Gessel的测试。 N 是斐波纳契数,当且仅当 5N 2 + 4 或 5N 2 - 4 < / em>是一个正方形数字。这在this SO question和this SO question中进行了讨论。您还可以找到示例here,但此页面上有Python代码(尽管它很容易理解)。
现在,如果你被要求专门使用递归......那么一种方法就是开始生成Fibonacci数,直到生成的数字变得大于或等于你正在测试的数字。如果匹配,则测试的数字属于斐波那契序列。如果没有匹配,并且您生成的数字大于测试的数字,则测试的数字不是斐波纳契数。
这是一个基本(又丑陋)的例子:
bool isFibonacci( int testedNumber, int a = 1, int b = 1 )
{
if( testedNumber == 0 || testedNumber == 1 )
return true;//returning true for 0 and 1 right away.
int nextFib = a + b;//getting the next number in the sequence
if( nextFib > testedNumber )
return false;//if we have passed the tested number, it's not in the sequence
else if( nextFib == testedNumber )
return true;//if we have a perfect match, the tested number is in the sequence
else
isFibonacci( testedNumber, b, nextFib );//otherwise, get the next fibonacci number and repeat.
}
将其用作isFibonacci( the_number_you_want_to_test );
请注意,斐波纳契数可以在O(log n)
时间内计算,例如this SO question中所述。
答案 1 :(得分:1)
这对我来说有点笨拙,但你可以试试:
bool isFib(int numToCheck int twoPrev = 0, int prev = 1) {
if (numToCheck == twoPrev || numToCheck == prev)
return true;
int currentFibNumber = twoPrev + prev;
if (currentFibNumber == numToCheck)
return true;
else if (currentFibNumber > numToCheck)
return false;
return isFib(numToCheck, prev, currentFibNumber);
}
这基本上使用递归迭代Fibonacci数,直到生成的数字超过您正在检查的值或找到匹配。
正如其他人所指出的那样,有一些解决方案不需要递归。
答案 2 :(得分:0)
Determining whether a number is a Fibonacci number看起来像是一样的东西,但在Java中 - 你可能会得到你在那里寻找的东西。
答案 3 :(得分:0)
Fibonacci数具有数学性质。 一个数字是Fibonacci,当且仅当(5 * n ^ 2 + 4)或(5 * n ^ 2 - 4)中的一个或两个是完美的正方形时(来源:Wiki)。
此方法比递归函数调用方法简单得多。检查此链接:
http://www.geeksforgeeks.org/check-number-fibonacci-number/
另一种方法:
static bool IsFib(long n)//n is the number to be checked
{
double root5 = Math.Sqrt(5);
double phi = (1 + root5) / 2;
long idx = (long)Math.Floor( Math.Log(n*root5) / Math.Log(phi) + 0.5 );
long u = (long)Math.Floor( Math.Pow(phi, idx)/root5 + 0.5);
return (u == n);
}
此代码适用于大型输入。 abelenky在stackoverflow中发布了类似的问题。