fibonacci系列代码在python中

时间:2014-12-01 19:08:36

标签: python-2.7

我在python 2.7中编写了这段代码来查找Fibonacci系列。但是我的代码中存在错误:

File "Fib.py", line 2, in <module>
    class Fib:
  File "Fib.py", line 21, in Fib
    for n in Fib(4):
NameError: name 'Fib' is not defined

有人能解决这个错误吗?

class Fib:
    def __init__(self,max):
        self.max = max

    def __iter__(self):
        self.a=0
        self.b = 1
        return self

    def __next__(self) :
        fib = self.a
        if fib > self.max :
            raise StopIteration 
        a,b=b,self.a+self.b
        return fib

for n in Fib(4):
    print n

3 个答案:

答案 0 :(得分:5)

免责声明:我无法从您发布的代码中重现您的错误(请参阅下面的猜测工作)。但是,我仍然会遇到错误,所以我会解决它们。

从您发布的代码:


我明白了:

Traceback (most recent call last):
  File "a.py", line 17, in <module>
    for n in Fib(4):
TypeError: instance has no next() method

看起来,如果你的目标python 2.7,你已经与python 3混淆了。__next__方法是在python 3中引入的(如果你感兴趣,可以在PEP 3114中)。在python 2中,使用next。此外,由于self必须用于访问实例成员变量,a,b=b,self.a+self.b应为self.a, self.b = self.b, self.a + self.b。这使你的代码:

class Fib:
    def __init__(self, max):
        self.max = max

    def __iter__(self):
        self.a = 0
        self.b = 1
        return self

    def next(self):
        fib = self.a
        if fib > self.max :
            raise StopIteration 
        self.a, self.b = self.b, self.a + self.b
        return fib

for n in Fib(4):
    print n

产生输出:

0
1
1
2
3

请注意,将next更改为__next__并将print n更改为print(n)会使其在python 3中运行(但不是python 2.如果您需要两者都需要将next转发至__next__并使用括号print)。

猜测实际代码:


根据您的错误判断,您的原始代码可能如下:

class Fib:
    def __init__(self,max):
        self.max = max

    def __iter__(self):
        self.a=0
        self.b = 1
        return self

    def __next__(self) :
        fib = self.a
        if fib > self.max :
            raise StopIteration 
        a,b=b,self.a+self.b
        return fib

    for n in Fib(4):  # Note that this makes the loop part of the class body
        print n

缩进for循环使其成为类主体的一部分,并且由于类名是一个尚不可访问的名称,因此它会引发NameError。对于一个更简单的例子,尝试(它给出了类似的错误):

class A:
    print A

因此,您遇到的错误很可能只是缩进混淆。但是,使用迭代器的好主意。

答案 1 :(得分:0)

实施斐波纳契系列的更简单方法:

known = {0:0, 1:1}


def fibonacci(n) : 

    if n in known:
        return known[n]
    res = fibonacci(n-1) + fibonacci(n-2)
    known[n] = res
    return res

答案 2 :(得分:0)

具有递归的Fibonnaci系列

def fib(term_num):  
    if term_num == 0 or term_num ==1:
        return term_num
    return fib(term_num-2) + fib(term_num-1)

for x in range(1,11):  
    print(fib(x))

下面的输出:
1 1 2 3 五 8 13 21 34 55