找到Fibonacci系列的总和

时间:2016-04-04 05:18:10

标签: algorithm fibonacci

我已经给了Set A我必须找到A的所有子集的斐波那契和的总和。

Fibonacci(X) - 是Fibonacci系列的第X个元素 例如,对于A = {1,2,3}

Fibonacci(1)+ Fibonacci(2)+ Fibonacci(3)+ Fibonacci(1 + 2)+ Fibonacci(2 + 3)+ Fibonacci(1 + 3)+ Fibonacci(1 + 2 + 3) 1 + 1 + 2 + 2 + 5 + 3 + 8 = 22

有没有办法可以在不生成子集的情况下找到总和?

因为我很容易找到所有子集的总和 即Sum of All Subset - (1+2+3)*(pow(2,length of set-1))

2 个答案:

答案 0 :(得分:4)

肯定有。

首先,我们回想一下,第n个斐波那契数等于

φ(n)= [φ^ n - (-φ)^( - n)] /√5

其中φ=(√5+ 1)/ 2(黄金比率)和(-φ)^( - 1)=(1-√5)/ 2。但是为了缩短它,让我将φ表示为A,将(-φ)^( - 1)表示为B.

接下来,让我们注意到斐波纳契数的总和是A和B的幂的总和:

[φ(n)+φ(m)] *√5= A ^ n + A ^ m - B ^ n - B ^ m

现在,足以计算(在{1,2,3}示例中)是

A ^ 1 + A ^ 2 + A ^ 3 + A ^ {1 + 2} + A ^ {1 + 3} + A ^ {2 + 3} + A ^ {1 + 2 + 3}。< / p>

但是,嘿,这有一个更简单的表达方式:

(A ^ 1 + 1)(A ^ 2 + 1)(A ^ 3 + 1) - 1

现在,是时候了解整个结果。

让我们的设置为{n1, n2, ..., nk}。然后我们的总和将等于

Sum = 1/√5 * [(A^n1 + 1)(A^n2 + 1)...(A^nk + 1) - (B^n1 + 1)(B^n2 + 1)...(B^nk + 1)]

我认为,从数学上讲,这是答案的“最简单”形式,因为n_i之间没有关系。但是,这个表达式的计算优化可能有一些空间。事实上,我不确定这个(使用实数)是否会比“直接”求和更快,但问题是关于避免子集生成,所以这就是答案。

答案 1 :(得分:1)

我使用Python 2.7测试了YakovL的答案。它运作良好,速度很快。我无法想象总结序列值会更快。这是实施。

_phi = (5.**0.5 + 1.)/2.

A = lambda n: _phi**n
B = lambda n: (-_phi)**(-n)
prod = lambda it: reduce(lambda x, y: x*y, it)
subset_sum = lambda s: (prod(A(n)+1 for n in s) - prod(B(n)+1 for n in s))/5**0.5

以下是一些测试结果:

print subset_sum({1, 2, 3})
# 22.0
# [Finished in 0.1s]

print subset_sum({1, 2, 4, 8, 16, 32, 64, 128, 256, 512})
# 7.29199318438e+213
# [Finished in 0.1s]