【问题标题】:Fibbonaci-like sequence of last 3 numbers最后 3 个数字的类斐波那契数列
【发布时间】:2014-11-14 01:01:32
【问题描述】:

有没有一种非递归的方式可以通过添加最后 3 个数字来制作“类似斐波那契”的序列?

这是我尝试的递归方式。

def fib3(n):
    if n < 3:
        return 1
    else:
        return fib3(n-1) + fib3(n-2) + fib3(n-3)

返回1+1+1+3+5+9+17...+(n-1) + (n-2) + (n-3)

任何帮助将不胜感激。

提前致谢

【问题讨论】:

  • 我认为你应该记住你的结果,否则仅仅计算 fib3(100) 可能会因为大量重复分支而搞砸你
  • 您是要求迭代(而不是递归)解决方案还是非递归公式?如果后者(确实存在常规斐波那契数),主题为 @ math.stackexchange.com 。

标签: python math fibonacci


【解决方案1】:

是的,而且非常优雅,具有 Python 的多重赋值能力:

>>> def fib3(n):
...     if n < 3:
...         return 1
...     a = b = c = 1
...     for i in range(3, n):
...         # We "shift" a, b, and c to the next values of the sequence.
...         a, b, c = b, c, (a + b + c)
...     return c
...
>>> fib3(4)
3
>>> fib3(5)
5
>>> fib3(6)
9
>>> fib3(7)
17

而且迭代法肯定比递归法更受欢迎——as @mu writes,递归实现的运行时间大约是O(3^n),而这个方法是O(n)。

【讨论】:

  • “正如@mu 所写”似乎是对一些中国古代圣人的引用 :^) 我已经修正了...有点:^)
【解决方案2】:

fib_sum 计算 m 最后一个整数:

>>> def fib_sum(n,m):
        if n < m:
            return "n should be greater than m"
        a,b,sumit = 0,1,0
        for x in range(n):
            print b,
            if x >= n-m:
                sumit += b
            a,b = b,a+b
        return sumit

>>> fib_sum(3,4)
'n should be greater than m'
>>> fib_sum(3,2)
1 1 2
3
>>> fib_sum(3,1)
1 1 2
2
>>> fib_sum(2,1)
1 1
1
>>> fib_sum(2,2)
1 1 
2
>>> fib_sum(7,2)
1 1 2 3 5 8 13
21
>>> fib_sum(7,3)
1 1 2 3 5 8 13
26
>>> fib_sum(8,6)
1 1 2 3 5 8 13 21
52
>>> fib_sum(8,8)
1 1 2 3 5 8 13 21
54

【讨论】:

    【解决方案3】:

    我迟到了,但是:人们可以很容易地推导出一个公式来获得任何线性递归的第 n 个元素,例如斐波那契数列或它的推广,而无需计算所有中间元素.假设你的重复是 f[n] = a[1] f[n - 1] + a[2] f[n - 2] + ... + a[m] f[n - m]。假设 f[n] = (某个常数)^n。 (这是一种经常出现在微分方程解中的“幸运猜测”假设。我不知道如何先验证明它。可以通过实际找到这样一个常数来证明事实。)然后常数必须是多项式 x^m - a[1] x^(m - 1) - a[2] x^(m - 2) - ... - a[m] 的根。解的任何线性组合也必须是解。您可以通过求解从前 m 个值导出的线性系统来找到线性组合的系数 c[1], ..., c[m](显然序列中所有后面的值的值由第一个确定m 值)。

    对于规定的递归 f[n] = f[n - 1] + f[n - 2] + f[n - 3],我们有 a[1] = a[2] = a[3] = 1 和 x^3 - x^2 - x - 1 的根分别为 - 0.6063 %i - 0.4196、0.6063 %i - 0.4196、1.839。假设前3个值为1,1,1。求解c[1] + c[2] + c[3] = 1, c[1] a[1] + c[2] a[2] + c[3] a[3] = 1, c[1] a[1]^2 + c[2] a[2]^2 + c[3] a[3]^2 = 1 对于 c[1 ]、c[2]、c[3] 分别产生 0.3592 %i + 0.2822、0.2822 - 0.3592 %i、0.4356。 (我把这些写成近似的浮点数。作为有理系数多项式的根,这些是代数数,但精确的表达式可能很容易变得混乱。)

    总之,f[n] = c[1] a[1]^n + c[2] a[2]^n + c[3] a[3]^n a's 和 c's 是一个函数,它给出递归的第 n 个元素 f[n] = f[n - 1] + f[n - 2] + f[n - 3],其中 f[2] = f [1] = f[0] = 1。

    我计算了Maxima 中的 a 和 c。如果有兴趣,我可以多说一下我是如何做到的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2020-01-18
      • 1970-01-01
      • 2013-08-03
      • 2014-05-19
      相关资源
      最近更新 更多