生成“自己的”斐波纳契数列

时间:2012-04-14 14:24:25

标签: algorithm fibonacci

我有一个不寻常的(我认为)问题。对于给定数量F_n(我不知道n的值),我必须找到数字F_0,F_1,使得F_ {n} = F_ {n-1} + F_ {n-2}。另外的困难是这个序列应该尽可能长(F_n的值n应该是最高的),如果存在多个解决方案,我必须用最小的F_0。总之,我必须生成我自己的“斐波那契”序列。一些例子:

in:F_n = 10; out:F_0 = 0; F_1 = 2;

in:F_n = 17; out:F_0 = 1; F_1 = 5;

in:F_n = 4181; out:F_0 = 0; F_1 = 1;

我观察到的每个序列(“Fibonacci规则”)F_n都有:

F_n = Fib_n * F_1 + Fib_ {n-1} * F_0

其中Fib_n是第n个斐波那契数。特别是斐波纳契数列确实如此。但我不知道这种观察是否值得。我们不知道n,我们的任务是找到F_1,F_0因此我认为我们什么也没有获得。有什么想法吗?

5 个答案:

答案 0 :(得分:3)

F n-1 = round(F n /φ)

其中φ=(√5+ 1)/ 2。

证明留给读者练习; ^ P

更新这是错误的,回到绘图板。

更新2 让我们从F n 和F n-1 向后计算。

F n-2 = F n - F n-1
F n-3 = F n-1 - F n-2 = F n-1 - (F n - F n-1 )= 2F n-1 - F n
F n-4 = F n-2 - F n-3 =(F n - F n-1 ) - (2F n-1 - F n )= 2F n - 3F n- 1
F n-5 = F n-3 - F n-4 =(2F n-1 - F n ) - (2F n - 3F n-1 )= 5F n-1 - 3F ñ
F n-6 = F n-4 - F n-5 =(2F n - 3F n-1 ) - (5F n-1 - 3F n )= 5F n - 8F n- 1

注意模式?很容易从真实的 Fibonacci序列和最后两个成员计算序列的任何成员。但是我们只知道最后一个成员,我们怎么能知道最后一个呢?

让我们用F n-1 来记下要求F i > 0。

F n-2 = F n -F n-1 &gt; 0⇒F n-1 &lt; ˚F<子>名词
F n-3 = 2F n-1 -F n 0⇒F n-1 &gt; ˚F<子>名词 / 2
F n-4 = 2F n -3F n-1 ⇒F n-1 &lt; 2F <子>名词 / 3
F n-5 = 5F n-1 -3F n ⇒F n-1 &gt; 3F <子>名词 / 5

因此,我们在实际Fibonacci序列的书面术语中有一个F n-1 的边界序列,每个都比前一个更紧密。仍然可满足的最后一个界限确定对应于最长序列的F n-1 。如果有多个数字满足最后一个边界,则使用最小或最大的数字,具体取决于序列是偶数还是奇数。

例如,如果F n = 101,则为 101 * 5/8&lt; F n-1 &lt; 101 * 8 /13⇒F n-1 = 63

先前(不正确)解决方案意味着F n-1 = 62,这是接近但没有雪茄。

答案 1 :(得分:2)

我不确定你在找什么。你提到的递归系列定义为:

Fn = F{n-1} + F{n-2}

显然,如果凝视值可以是任何值,我们可以选择F{n-1},这将给出F{n-2} ( = Fn=F{n-1})。知道F{n-1} = F{n-2} + F{n-3}F{n-3}之后可以从F{n-1} and F{n-2}计算F{n}。这意味着您可以将数字追溯到无穷大,因此没有“最长”的序列,并且有无限多的有效序列。

在某种程度上,您正在计算具有初始值F{n-1}F{i} = F{i+2}-F{i+1}的反Fibonacci序列,其中iF{i}永远在减少

更新: 如果您希望将解决方案空间约束到所有Fib{i}都是非负整数的结果,那么您将只获得少数(大多数时间为单例)解决方案。

如果您计算原始斐波纳契数(F{n} < Fib{i-1}),很快就会得到F{0};显然你不需要再进一步了。然后,您可以尝试F{1}F{n} <= Fib{i} * F{1}+ Fib{i-1} * F{0}的所有可能组合,以便F{0} - 非负F{1}和{{1}只有一定数量的可能性(显然可以排除F{0}=F{1}=0)。然后看看哪些i(s)在满足平等的那些中是最高的 - 你得到F{0}F{1}

答案 2 :(得分:2)

你的等式

F_n = Fib_n * F_1 + Fib_{n-1} * F_0

linear Diophantine equation in two variables F_1F_0。该链接提供了一种有效的算法来计算解决方案集的描述,使您可以找到解决方案(如果存在),最小F_1 >= 0F_0 >= 0F_0。然后,您可以尝试猜测n = 0, 1, ...,直到找不到解决方案。这种方法是log(F_n)中的多项式。

答案 3 :(得分:2)

  

F_n = Fib_n * F_1 + Fib_ {n-1} * F_0

     

其中Fib_n是第n个斐波那契数。特别适合   斐波那契序列。但我不知道这个观察是否是   值得一试。我们不知道n,我们的任务是找到F_1,F_0所以我   我们认为我们一无所获。

嗯,你正在寻找最长的序列,这意味着你想要最大化n

为斐波纳契数创建一个查找表。从最大n开始,Fib_n <= F_n,表格中的上一个条目为fib_n{n-1}。现在唯一的变量是F_1F_0。解决linear Diophantine equation。如果它有解决方案,你就完成了。如果没有,请将n减1,然后重试,直到找到解决方案。

注意:解决方案始终存在,因为F_2 = 1 * F_1 + 0 * F_0具有解决方案F_2 = F_1

答案 4 :(得分:0)

模拟用矩阵计算Fibonacci数(但具有不同的初始值)。 [[0 1] [11]]到幂k将在乘以[F_ {n},F_ {n + 1}]时产生[F_ {n + k},F_ {n + 1 + k}]。

由于将矩阵提升为幂是O(log n)(假设整数的乘法是O(1)),您可以在O(log n)时间内执行整个计算,直到矩阵系数开始占主导地位。计算。

我不知道你工作的数字有多大,但这个矩阵的n次幂是[[F_ {n-1} F_n] [F_n F_ {n + 1}] ]。并记录(F_n)~n / 5(因此第十亿个斐波那契数字将有大约2亿个数字)。