给定斐波纳契数n,我如何计算斐波纳契数列中的先前数?
答案 0 :(得分:6)
除以phi((1 + sqrt(5)) / 2
)并舍入到最接近的整数。
这是因为Nth Fibonacci数是
Fn = (Phi ^ n - Psi ^ n) / (Phi - Psi)
其中Psi = -1 / Phi
。通过重新排列公式并稍微按摩它,您将得到F_n+1 / Phi
和F_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 = c
和a*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