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

m因此,给定从to 的两个变量,我需要创建一个列表,其中包含介于和(但不能超过)n (and m < n)之间的斐波那契数列的所有数字,例如: if和then should be 。mnm = 2n = 20fib[2,3,5,8,13]

4

8 回答 8

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]
于 2013-07-25T02:44:16.153 回答
1

我不知道如何在中途开始斐波那契序列,所以我能想到的最好的办法就是在之后过滤结果。

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和一个 iterable x,并返回一个新的 iterable ,其中包含所有为 true 的x元素f(x)

于 2013-07-25T01:47:47.193 回答
0

使用生成器:

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 5 8 13 21 34 55 89 144

于 2013-07-25T05:54:02.327 回答
0

我用谷歌搜索并在这里找到斐波那契的第 n 项公式

所以代码可能是:

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
于 2013-07-25T04:48:54.543 回答
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))

我希望这是你需要的。

于 2013-07-25T02:00:32.827 回答
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数字。

所以,如果你不想使用这个公式,最好只保留一个斐波那契数字列表并使用它,如果事实证明你需要介于两者之间的数字lowhigh那么high > fib_nums[-1]你总是可以使用fib_nums[-1]and fib_nums[-2]asbato计算您缺少的值。

于 2013-07-25T05:15:01.310 回答
0

假设 (nm) 相对较小,获得对数顺序解决方案需要考虑一些子问题。如果 (nm) 可以相对较大,则最好预先计算所有结果并简单地进行二进制搜索。

  1. 我们能在对数时间内找到第 i 个斐波那契数吗?
  2. 我们能找到满足 fib(j) >= m 的数字 j 吗?

对于第一个问题,我们可以使用( http://en.wikipedia.org/wiki/Fibonacci_number#Matrix_form )找到第 i 个斐波那契。

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

于 2013-07-25T05:38:31.200 回答
0

我感谢递归计算斐波那契数或将所有数字放入列表中简单明了。但如果数量太大,那就不是一个好主意。这是代码,顺便说一句

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()
于 2013-07-25T02:34:22.110 回答