在今天的一次采访中,我得到了这个序列,这是一种经过修改的斐波那契:
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序列的修改版本来解决它。
答案 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/
所以你可以使用循环而不是堆栈解决问题。