我能够为所有大于0的数字写一个递归的Fibonacci函数,但是对于任何负数,该函数都是完全错误的。知道如何在c ++中实现它吗?
int fibonacci(int n){
if(n == 0)return 0;
if(n == 1)return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
答案 0 :(得分:3)
根据维基百科http://en.wikipedia.org/wiki/Generalizations_of_Fibonacci_numbers,负数的递归函数与正数的递归函数不同。
对于正确的:
n_2 = n_1 + n_0
对于否定:
n_-2 = n_-1 - n_0
这样,递归就可以起作用了#34;只是反过来"并且相同的代码不起作用。你必须写一个新的功能。
编辑:维基百科提供概括:F_-n =( - 1)^ n F_n所以只计算F_n并用(-1)^ n修改符号
答案 1 :(得分:1)
这个帖子有点晚了但是这个问题是我的2美分。
如wikipedia条目所示,Fibonacci可以是双向的。 为了在PHP中实现它,您需要首先检查入站参数是否为负数,以便您知道如何在以后处理它,因为它需要一个不同的公式来处理否定值。
注意斐波纳契数的负面并不总是产生负值。
双向公式为:
F -n =(-1) n +1 x F n ;
Fibonacci需要为0和1播种,当实现双向Fibonacci时,您还需要考虑 -1 ,如2个出口点所示。
-----------------------------------------------------------------------
F−6 | F−5 | F−4 | F−3 | F−2 | F−1 | F0 | F1 | F2 | F3 | F4 | F5 | F6
----+-----+-----+-----+-----+-----+----+----+----+----+----+----+------
−8 | 5 | −3 | 2 | −1 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8
-----------------------------------------------------------------------
以下是斐波那契用于处理否定数据的变体;
function negaFibonacci($n)
{
// seed+exit
if(($n == 1) || ($n == -1))
{
return 1;
}
// seed+exit
if($n == 0)
{
return 0;
}
if($n < 0)
{
//https://en.wikipedia.org/wiki/Fibonacci_number#Negafibonacci
return pow(-1,$n+1) * negaFibonacci(abs($n));
}
else
{
//standard fib calc
return negaFibonacci($n - 1) + negaFibonacci($n - 2);
}
}
使用舍入功能可以进一步改进该功能,但为了便于阅读,我保留了该功能。
答案 2 :(得分:0)
以下是我会这样做的,我想:
int fibonacci(int n){
if (n < 0)
return fibonacci(n * -1) * -1;
if (n == 0) || (n == 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}