Python:Fibonacci序列

时间:2013-03-08 23:56:12

标签: python fibonacci

我只是想通过制作一些基本功能来提高我的编程技巧。

我想用斐波纳契值填充一个列表,但我认为我的代码给出了所有数字的总和,然后打印出来......

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)

print numberlist

fibonaccinumbers = []

for n in numberlist:
    def fib(n):
        a, b = 0, 1
        for i in range(n):
            a, b = b, a + b
        return a
    a = fib(n)
    fibonaccinumbers.append(a)


print a

我哪里出错?

11 个答案:

答案 0 :(得分:12)

print a

好吧,你打印最终值。


还有一些关于您的代码的评论:

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)

你不需要在那里初始化i,for循环就是为你做的。此外,您可以通过以下方式简化整个块:

numberlist = list(range(20))

鉴于您实际上并不需要将其作为列表,您根本不需要构建它,但您可以稍后运行for n in range(20)

然后你一遍又一遍地重新定义循环内的fib函数。你应该在它之外定义它,然后重复使用它。

此外,当您知道要创建多个斐波那契数字列表时,只需存储您计算的所有数字。这样你就不必一遍又一遍地做同样的事情。您还可以使用生成器函数使这一切变得更容易:

def fibGenerator():
    a, b = 0, 1
    yield 0
    while True:
        a, b = b, a + b
        yield a

fibonaccinumbers = []
fib = fibGenerator()
for n in range(20):
    fibonaccinumbers.append(next(fib))

不是迭代一个范围并手动调用生成器上的next,而是还可以使用itertools中的take-recipe来执行此操作:

fibonaccinumbers = take(20, fibGenerator())

在发电机上

  

但仍不太确定发电机的作用。

生成器是一个Python函数,它生成一系列返回值。这些值是懒惰生成的,这意味着当您请求时。您只需使用yield代替return即可创建生成器。 yield将“返回”一个值并暂停生成器。下次请求值时,生成器将从中断处继续。

使用生成器可以创建无限序列。正如您在上面fibGenerator的定义中所看到的,有一个无限的while循环,里面有yield。当发电机停止时,尽管有这个循环,它也不会挂起。

这是一个快速的自我解释的例子:

>>> def example():
    print('begin')
    i = 0
    while True:
        print('Calculating next value')
        yield i
        i += 1

>>> g = example()
>>> next(g)
begin
Calculating next value
0
>>> next(g)
Calculating next value
1
>>> next(g)
Calculating next value
2
>>> next(g)
Calculating next value
3
>>> next(g)
Calculating next value
4

next函数是内置函数,它从 iterable 中请求下一个值。迭代是你可以迭代的任何东西(例如for x in iterable: ...);任何生成器也是可迭代的。

答案 1 :(得分:2)

抱歉,我是个白痴。我正在打印'a',这是斐波那契的最后一次迭代计算。

我本应该打印我的清单。

...该死

答案 2 :(得分:2)

问题出在最后一行。分散注意力,我敢肯定:你应该打印清单,而不是a

其他一些提示:

1:这整个块只是重新创建range返回的列表:

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)

分配i = 0也没有实际意义。相反,尝试:

numberlist = range(20)

在python 3中,调用list(range(20)),因为range不会创建完整的列表。

2:在循环的每次传递中重新定义fib函数不会产生问题,但肯定没有必要。将定义移到外面:)

答案 3 :(得分:2)

本着提高编程技能的精神:您可以使用a generatoritertools.islice()获取第一个n斐波纳契数列表:

from itertools import islice

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

fibonacci_numbers = list(islice(fib(), 20))
print(fibonacci_numbers)

输出

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]

答案 4 :(得分:2)

以为我会分享一些pyLove:

def fib(n, a = 0, b = 1):
    seq = [a,b]
    while len(seq) < n:
        seq += [seq[len(seq)-1] + seq[len(seq)-2]]
    return seq

print(fib(13))

输出为:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

#or if you want to make up your own
print(fib(13, 1597, 2584))

输出为:

[1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229]

答案 5 :(得分:1)

我将其浓缩并接受了'range'或至少list(range())创建自己的列表的事实:

numberlist = list(range(20))

def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a

fibonaccinumbers = [fib(n) for n in numberlist]

print fibonaccinumbers

似乎有效,将每个斐波那契值打印到第20次迭代。我怎么能在def之外调用'fib(n)'而不做一些奇怪的事情,例如:

a = fib(n)

这是我以前习惯的风格。无论如何,该程序现在看起来不错吗?

答案 6 :(得分:1)

斐波那契系列中的第n个术语是:

enter image description here 哪里 enter image description hereenter image description here

使用上述标识,可以使用列表推导生成系列:

[int(((((1 + math.sqrt(5)) / 2) ** x) - (((1 - math.sqrt(5)) / 2) ** (x))) / math.sqrt(5)) for x in range(n)] //where n is the number of terms in the series

答案 7 :(得分:0)

由于每个斐波那契数都来自所有先前的数,因此从头开始计算每个斐波那契数是没有意义的。最好使用收集Fibonacci数字的列表来计算每个后续数据:

def FibList(n):
    rc = []
    for i in xrange(n):
        if i < 2:
            rc.append(1)
        else:
            rc.append(rc[i-2] + rc[i-1])

    return rc

print FibList(20)

如果你真的想要漂亮,你可以创建一个计算Fibonacci值的生成器函数,并用它来构建你的列表:

def Fib(n):
    n1 = 1
    n2 = 1

    for i in xrange(n):
        if i < 2:
            yield 1
        else:
            n3 = n1 + n2
            n1 = n2
            n2 = n3
            yield n3

fiblist = [x for x in Fib(20)]
print fiblist

在生成器函数中,'yield'关键字返回列表的每个值。 fiblist使用称为“list comprehension”的内容使用生成器构建列表的行。您也可以在for循环中使用生成器:

for fnum in Fib(20):
    print fnum

答案 8 :(得分:0)

我刚刚使用了公式并插入了值:

import math 

def Fibs(n):

 for i in range (n):

     Fn=int(((((1+math.sqrt(5))**i) - ((1-math.sqrt(5)) **i))/(2**i) * (math.sqrt(5)))/5)
     print (Fn)

Fibs(int(input())

答案 9 :(得分:0)

def fibonacci(number):
        numbers = [0, 1]
        while len(numbers) < number:
            numbers[len(numbers):len(numbers)] = [numbers[len(numbers)-2] + numbers[len(numbers)-1]]
        return numbers

每次循环运行时,列表中的最后两个值都会相加。 使用每个新的斐波纳契值创建列表中的新位置,同时迭代到输入的长度。

答案 10 :(得分:0)

为什么不使用列表推导?这是我解决问题的方法。我将定义一个函数,如下所述计算斐波那契数列的第 n 条。

df.set_index('Bob',append=True,inplace=True)
>>> df
                 Count  Price
Fruit Color Bob              
Apple Red   0        3  $1.29
      Green 1        9  $0.99
Pear  Red   0       25  $2.59
      Green 1       26  $2.79
Lime  Green 0       99  $0.39

然后,我将使用列表推导来获取所需的序列。

def fibo(n):
    if n<=2:
        return 1
    else:
        res = fibo(n-1) + fibo(n-2)
    return res