【问题标题】:Find the sum of Fibonacci Series求斐波那契数列之和
【发布时间】:2016-07-23 13:04:36
【问题描述】:

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

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

斐波那契(1) + 斐波那契(2) + 斐波那契(3) + 斐波那契(1+2) + 斐波那契(2+3) + 斐波那契(1+3) + 斐波那契(1+2+3) 1 + 1 + 2 + 2 + 5 + 3 + 8 = 22

有什么方法可以在不生成子集的情况下找到总和?

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

【问题讨论】:

  • 你不认为空集是一个子集吗?
  • A 中的数字是连续的还是任意的?例如,你能有A = {1, 3, 6, 7}吗?
  • @MOehm 任意...
  • 为什么不想生成子集?

标签: algorithm fibonacci


【解决方案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]

【讨论】:

  • @user5349222 {2, 2} 不是集合...改用列表
【解决方案2】:

肯定有。

首先,让我们回忆一下第 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}。

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

(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 之间没有关系。然而,这个表达式可能有一些计算优化的空间。事实上,我完全不确定这(使用实数)是否会比“直接”求和更快,但问题是关于避免子集生成,所以这就是答案。

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2015-11-12
    • 2015-06-05
    • 2011-02-04
    相关资源
    最近更新 更多