获得修改后的Fibonacci序列的第N位数

时间:2012-06-01 22:51:36

标签: algorithm math

在今天的一次采访中,我得到了这个序列,这是一种经过修改的斐波那契:

1,1,2,4,6,13,19,42,61,135,......,

我被要求编写一个函数来返回 n 处的数字。

因此,如果n = 4,则函数应返回4,n = 6返回13等

我确信您已经注意到,不同之处在于,即使是与之前4项相等的项目,而奇数项也与之前的2项相同。

如果使用递归,这不是问题。这就是我所做的,但这不是我想要的方法。

Fibonacci计算就像这样(在PHP中):

$n = 17;
$phi = (1 + sqrt(5)) / 2;
$u = (pow($phi, $n) - pow(1 - $phi, $n)) / sqrt(5);

$ u ,在这种情况下,是1597。

但是,我不知道如何使用像这样的Fibonacci序列的修改版本来解决它。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要有效地计算[即在O(log(n))]序列中定义为:

a[2n + 5] = a[2n + 4] + a[2n + 3] + a[2n + 2] + a[2n + 1]
a[2n + 2] = a[2n + 1] + a[2n]

让我们定义两个新序列。第一个对应于偶数位置的 a 值,第二个对应偶数位置的值:

b[n] = a[2n]
c[n] = a[2n + 1]

现在我们有:

c[n] = b[n] + c[n - 1] + b[n - 1] + c[n - 2]
b[n] = c[n - 1] + b[n - 1]

从我们得到的第一个等式(经过一些转换)中减去第二个等式:

b[n] = ( c[n] - c[n-1] ) /2

接下来将此公式替换为第一个等式,以获得 c 的公式:

c[n] = 2 c[n-1] + c[n-2] 

请注意,此等式仅涉及 c 中的元素。因此,现在可以使用here描述的技术计算 c 的元素。通过稍微改变方程式,您将能够有效地计算 b

答案 1 :(得分:0)

  

与由常系数线性递推定义的每个序列一样,斐波纳契数具有闭式解。

http://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression

但是,我不知道如何为这个特定序列创建一个封闭的表单表达式。

我可以补充的是,您可以在没有递归的情况下解决Fibonacci或任何类似的序列,例如:

http://forum.codecall.net/topic/41540-fibonacci-with-no-recursion-for-fun/

所以你可以使用循环而不是堆栈解决问题。