如果输入是斐波那契数列中的第n个项,则找到n

时间:2012-11-19 12:54:29

标签: fibonacci series

在斐波那契系列中,我们假设第n个斐波那契项为T. F(n)= T.但我想写一个程序,将T作为输入并返回n,这意味着它在系列中的哪个术语(取T总是将是斐波纳契数。)我想找到是否有找到它的有效方法

2 个答案:

答案 0 :(得分:2)

简单的方法是简单地开始生成Fibonacci数,直到F(i)== T,如果正确实现则具有O(T)的复杂度(读取:不递归)。此方法还允许您确保T是有效的斐波纳契数。

如果T 保证是有效的斐波纳契数,则可以使用近似规则: Formula

看起来很复杂,但事实并非如此。关键点是:从某一点开始,F(i + 1)/ F(i)的比率变为恒定值。既然我们没有生成Fibonacci数字,但只是找到了“索引”,我们可以放弃大部分数据并实现以下目标:

breakpoint := f(T)
Any f(i) where i > T = f(i-1)*Ratio = f(T) * Ratio^(i-T)

我们可以通过简单地取Log(N,R),R为Ratio来得到相反的结果。通过调整早期数字的不准确性,我们甚至不必选择断点(如果你这样做:它是正确的,对于i> 17)。

该比率约为1.618034。取6765(= F(20))的对数(1.618034),我们得到18.3277的值。对于任何更高的斐波纳契数,精度保持不变,因此简单地向下舍入并且加2给出了精确的斐波那契“等级”(假设F(1)= F(2)= 1)。

答案 1 :(得分:0)

第一步是以非递归方式实现fib数,例如

fib1=0;fib2=1;
for(i=startIndex;i<stopIndex;i++)
{
     if(fib1<fib2)
     {
        fib1+=fib2;
        if(fib1=T) return i;
        if(fib1>T) return -1;
     }
     else
     {
        fib2+=fib1;
        if(fib2=T) return i;
        if(fib2>t) return -1;
     }
}

这里startIndex将设置为3,stopIndex将设置为10000左右。要减少迭代次数,您还可以选择2个种子数,这些种子数是序列中的顺序fib数。然后将startIndex设置为下一个索引,并通过对stopIndex进行适当调整来进行计算。我建议根据机器性能和最大预期输入在几个部分中断序列以最小化运行时间。