计算Fibonacci序列中的先前数字

时间:2014-05-11 12:14:46

标签: algorithm

给定斐波纳契数n,我如何计算斐波纳契数列中的先前数?

4 个答案:

答案 0 :(得分:6)

除以phi((1 + sqrt(5)) / 2)并舍入到最接近的整数。

这是因为Nth Fibonacci数是

Fn = (Phi ^ n - Psi ^ n) / (Phi - Psi)

其中Psi = -1 / Phi。通过重新排列公式并稍微按摩它,您将得到F_n+1 / PhiF_n之间的差异小于Psi ^ n,并且从| Psi | < 1开始,舍入到​​最接近的整数将产生正确的结果。

答案 1 :(得分:0)

可以使用matrix exponentiation找到Fibinacci编号:

    n
1 1     =   F_n+1   F_n
1 0         F_n     F_n-1

通过应用二进制搜索来查找n,您可以找到所需斐波那契数n的索引,并从矩阵提取F_n-1

请注意,此方法在浮点精度方面是稳定的(它只使用整数),运行时间为O(logn),其中n是给定斐波那契数的索引。

答案 2 :(得分:0)

这是解决问题的一种简单易懂但可能效率低下的方法。基本上,你可以计算每个斐波纳契数到你的数字,将它们存储在一个数组中,一旦你点击n或在这种情况下为fibNum,只需在n之前返回索引处的数字。

  var prevFibonacci = function(fibNum) {
    var fibNums = [0,1]; // array to hold fibonacci numbers
    var i = 1;

    while (fibNums[i] !== fibNum) {
      var nextFib = fibNums[i] + fibNums[i-1];
      fibNums.push(nextFib);
      i++;
    }

    return fibNums[i-1];
  };

答案 3 :(得分:0)

Given a Fibonacci number , find the next Fibonacci number

每3个连续的斐波那契数字a, b, c满足a+b = ca*c = b² ± 1,其中符号在+-之间交替显示。

将第一个方程代入第二个方程,得到a*(a+b) = b² ± 1

求解a得到a = (-b ± √(5b² ± 4)) / 2

由于我们知道a是正数,因此必须变为a = (-b + √(5b² ± 4)) / 2

然后剩下的工作就是检查5b² ± 4中哪个是完美的正方形。

伪代码:

prevFibonacci(n):
  m = 5*n*n - 4
  x = round(sqrt(m))

  if m != x*x:
    m = 5*n*n + 4
    x = round(sqrt(m))

  return (x - n) / 2