递归Fibonacci函数(带负数)

时间:2014-09-15 23:33:13

标签: c++ function recursion fibonacci

我能够为所有大于0的数字写一个递归的Fibonacci函数,但是对于任何负数,该函数都是完全错误的。知道如何在c ++中实现它吗?

int fibonacci(int n){
    if(n == 0)return 0;
    if(n == 1)return 1;

    return fibonacci(n - 1) + fibonacci(n - 2);
}

3 个答案:

答案 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);
}