斐波纳契序列从点a到点b?

时间:2013-07-25 01:41:42

标签: python list loops fibonacci

m = 2
n =20
a,b = m,0
fib = [m]
while a <= n:
   fib.append(a)
   a,b = a+b, a

因此,从mn (and m < n)给出两个变量,我需要创建一个列表,其中包含mn之间的所有Fibonacci序列号(但不能超过)例如:如果m = 2n = 20,那么fib应为[2,3,5,8,13]

8 个答案:

答案 0 :(得分:1)

我不知道如何在中途启动fibonnaci序列,所以我能想到的最好是过滤后的结果。

def f(low, high):
    fib = [0]
    a, b = 1, 0
    while a <= n:
       fib.append(a)
       a,b = a+b, a
    return filter(lambda x: x >= low and x =< high, fib)

斐波那契代码是微不足道的,你可能在这里看到的新东西是filter,它接受​​一个函数f和一个可迭代的x,并返回一个新的可迭代的全部来自x的元素使f(x)成立。

答案 1 :(得分:1)

def fib(m,n):
    a,b = 1,1
    while a < m:
        a,b = b, a+b

    answer = [a]
    while b < n:
        a,b = b, a+b
        answer.append(a)
    return answer

In [2040]: fib(2,20)
Out[2040]: [2, 3, 5, 8, 13]

答案 2 :(得分:0)

m  = int(raw_input("Enter the start number : "))
n = int(raw_input("Enter the end number : "))
def fib(i):
if i == 0: return 0
elif i == 1: return 1
else: return f(i-1)+f(i-2)
print map(fib, range(m, n))

我希望这是你需要的。

答案 3 :(得分:0)

我感谢通过递归计算斐波纳契数或将所有数字放在列表中简单明了。但如果数量太大,那不是一个好主意。 这是代码,BTW

def main():
    print fibo(100,600)
def fibo(m,n):
    f0=2
    f1=3
    while f1<m:
        tmp=f1
        f1=f0+f1
        f0=tmp
    res=[f0]
    while f1<n:
        res.append(f1)
        f1=res[-2]+res[-1]
    return res[1:];

if __name__ == '__main__':
    main()

答案 4 :(得分:0)

我用谷歌搜索并找到斐波纳契的第n项公式here

所以代码可以是:

def fibn(n):
     Phi = (1+math.sqrt(5))/2
     phi = (1-math.sqrt(5))/2
     return round((math.pow(Phi, n) - math.pow(phi, n))/math.sqrt(5))

>>> fibn(0)
0.0
>>> fibn(1)
1.0
>>> fibn(2)
1.0
>>> fibn(3)
2.0
>>> fibn(4)
3.0
>>> fibn(5)
5.0
>>> fibn(6)
8.0
>>> fibn(7)
13.0
>>> fibn(8)
21.0
>>> fibn(9)
34.0
>>> fibn(10)
55.0

答案 5 :(得分:0)

您可以执行以下操作:

def fibs(low,high):
    a, b = 0, 1
    while 1:
        a, b = b, a+b
        if low <= a:
            if a <= high:
                yield a
            else:
                break

你可以像

一样使用它
>>> for num in fibs(2,15):
...     print num
... 
2
3
5
8
13

但是,如果不依靠nth斐波纳契数的公式并依赖于正确的舍入,则无法在不计算第一个nth数字的情况下获得n-1数字。

所以,如果你不想使用这个公式,最好只保留斐波那契数字列表并使用它,如果事实证明你需要low和{{之间的数字1}} high,然后您可以始终使用high > fib_nums[-1]fib_nums[-1]作为fib_nums[-2]b来计算您缺少的值。

答案 6 :(得分:0)

为了获得日志订单解决方案,需要考虑一些子问题,假设(n-m)相对较小。如果(n-m)可以相对较大,则最好预先计算所有结果并简单地进行二分搜索。

  1. 我们能在日志时间找到第i个斐波纳契数吗?
  2. 我们能找到数字j,使得fib(j)> = m?
  3. 对于第一个问题,我们可以使用(http://en.wikipedia.org/wiki/Fibonacci_number#Matrix_form)找到我的斐波那契。

    第二个问题可以使用二分搜索来解决,并使用第一种方法来找到斐波那契数&gt; = m。一旦我们知道 j ,我们就可以在对数时间内找到 j + 1 次斐波纳契数,并使用这些数字生成所有其他数字&lt; = n。

答案 7 :(得分:0)

使用Generator:

import os,sys

def fib(num):
    a=0
    b=1
    while 1:
        a,b =b, b+a
        yield a

low=2
high=200
for i in fib(range(1)):
    if i <= high and i >= low :
        print i
    elif i > high:
        break

O / P 2 3 五 8 13 21 34 55 89 144