【问题标题】:Recursive Fibonacci Function (With Negative Numbers)递归斐波那契函数(带负数)
【发布时间】:2014-11-09 14:19:08
【问题描述】:

我可以为所有大于 0 的数字编写递归斐波那契函数,但对于任何负数,该函数都是完全不正确的。知道如何在 C++ 中实现这一点吗?

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

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

【问题讨论】:

  • 负数菲诺纳奇的定义是什么?
  • 告诉我们你有什么?
  • 好吧,这不是一个 C++ 问题?是算法题吗?
  • 我猜定义在这里:en.wikipedia.org/wiki/…
  • 更改序列顺序并隔离最小值而不是最大值。一般顺序是F(n) = F(n-1)+F(n-2),将F(n-1) 移到等价的另一边:F(n-2) = F(n) - F(n-1)

标签: c++ function recursion fibonacci


【解决方案1】:

根据维基百科http://en.wikipedia.org/wiki/Generalizations_of_Fibonacci_numbers,负数的递归函数与正数的递归函数不同。

对于阳性: n_2 = n_1 + n_0

对于否定: n_-2 = n_-1 - n_0

这样递归就“正好相反”起作用,而相同的代码将不起作用。您将不得不编写一个新函数。

编辑:维基百科提供了概括:F_-n = (-1)^n F_n 所以只需计算 F_n 并用 (-1)^n 修改符号

【讨论】:

  • 它必须在一个函数中工作。有人告诉我它可以用 8 行代码递归完成。
  • 然后发布您拥有的代码以及您的问题到底是什么。这是 C++ 问题还是算法问题?
  • 看看我的编辑。这可能是最简单的方法。
  • 您的解决方案非常完美。谢谢。
【解决方案2】:

这个帖子有点晚了,但这是我在这个问题上的 2 美分。

wikipedia 条目所示,斐波那契可以是双向的。 为了在PHP 中实现它,您需要首先检查入站参数是否为负数,以便您知道以后如何处理它,因为它确实需要不同的公式来处理负数。

请注意,斐波那契数的负数并不总是产生负值。

双向的公式为:

F-n = (-1)n+1 x Fn;

斐波那契需要为 0 和 1 播种,在实现双向斐波那契时,您还需要考虑 -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);
    }


}

可以通过舍入功能进一步改进该功能,但为了便于阅读,我将其保留原样。

【讨论】:

【解决方案3】:

我想我会这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2020-03-21
    • 2021-11-17
    • 2011-07-27
    • 2010-12-03
    • 2020-07-15
    相关资源
    最近更新 更多