Python斐波纳契生成器

Python Fibonacci Generator

我需要做一个程序,要求打印的斐波那契数的数量,然后像0,1,1,2…但我不能让它工作。我的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
a = int(raw_input('Give amount: '))

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

a = fib()
a.next()
0
for i in range(a):
    print a.next(),


我会用这种方法:

Python 2

1
2
3
4
5
6
7
8
9
a = int(raw_input('Give amount: '))

def fib(n):
    a, b = 0, 1
    for _ in xrange(n):
        yield a
        a, b = b, a + b

print list(fib(a))

Python 3

1
2
3
4
5
6
7
8
9
a = int(input('Give amount: '))

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

print(list(fib(a)))

你给a的含义太多了:

1
a = int(raw_input('Give amount: '))

VS

1
a = fib()

如果给变量赋予更具描述性的名称(在10行代码中使用3种不同的名称a),就不会经常遇到问题。:

1
amount = int(raw_input('Give amount: '))

range(a)改为range(amount)


既然你在写一个生成器,为什么不使用两个收益率来节省额外的洗牌时间呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
import itertools as it

num_iterations = int(raw_input('How many? '))
def fib():
    a,b = 0,1
    while True:
        yield a
        b = a+b
        yield b
        a = a+b

for x in it.islice(fib(), num_iterations):
    print x


将斐波那契数列打印到n号的简单方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def Fib(n):
    i=a=0
    b=1
    while i<n:
        print (a)
        i=i+1
        c=a+b
        a=b
        b=c




Fib(input("Please Enter the number to get fibonacci series of the Number : "))

要用生成器得到任意数(在本例中是100)之前的斐波那契数,可以这样做。

1
2
3
4
5
6
7
8
9
10
11
12
def getFibonacci():
    a, b = 0, 1

    while True:
        yield b
        b = a + b
        a = b - a

for num in getFibonacci():
    if num > 100:
        break
    print(num)

1
2
3
4
5
def fibonacci(n):
    fn = [0, 1,]
    for i in range(2, n):
        fn.append(fn[i-1] + fn[i-2])
    return fn


你有一个正确的想法和一个非常优雅的解决方案,你需要做的就是你的交换和添加A和B的语句。你的收益率语句也应该在你的交换之后进行。

a, b = b, a + b ####应为a,b = a+b,a #####

1
`###yield a`

此外,您还可以尝试封闭形式的解决方案(由于舍入/溢出错误,无法保证非常大的n值):

1
2
3
4
5
root5 = pow(5, 0.5)
ratio = (1 + root5)/2

def fib(n):
    return int((pow(ratio, n) - pow(1 - ratio, n))/root5)

还可以使用枚举无限生成器:

1
2
3
for i,f  in enumerate(fib()):
    print i, f
    if i>=n: break

python是一种动态类型语言。变量的类型在运行时确定,并且可以随着执行的进行而变化。在这里,您首先声明了一个保存整数类型的函数,然后为它分配了一个函数,因此它的类型现在变成了一个函数。

您正在尝试将"a"作为参数应用于range()函数,该函数需要int参数,但实际上您提供了一个函数变量作为参数。

正确的代码应该是

1
2
3
4
5
6
7
8
9
10
11
12
13
 a = int(raw_input('Give amount: '))

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

b = fib()
b.next()

for i in range(a):
    print b.next(),

这会起作用


你的a是一个全球性的名字。

1
a = int(raw_input('Give amount: '))

每当python看到一个a时,它都认为您在谈论上面的一个。把它称为其他(其他地方或这里)应该会有所帮助。


我喜欢这个版本:

1
2
3
4
5
6
7
array = [0,1]

for i in range(20):
   x = array[0]+array[1]  
   print(x)
   array[0] = array[1]
   array[1] = x

你好像用了两次a。尝试将其更改为其他变量名。

以下内容似乎对我很有用。

1
2
3
4
5
6
7
8
9
def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a+b

f = fib()
for x in range(100):
    print(f.next())

我刚才建了这个:

1
2
3
4
5
6
7
8
9
10
a = int(raw_input('Give amount: '))

fab = [0, 1, 1]
def fab_gen():
    while True:
        fab.append(fab[-1] + fab[-2])
        yield fab[-4]

fg = fab_gen()
for i in range(a): print(fg.next())

不,随着时间的推移,fab将不断增长,因此这不是一个完美的解决方案。


以下是生成fiboncci的两种解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def fib_generator(num):
    '''
    this will works as generator function and take yield into account.
    '''

    assert num > 0
    a, b = 1, 1
    while num > 0:
        yield a
        a, b = b, a+b
        num -= 1


times = int(input('Enter the number for fib generaton: '))
fib_gen = fib_generator(times)
while(times > 0):
    print(next(fib_gen))
    times = times - 1


def fib_series(num):
    '''
    it collects entires series and then print it.
    '''

    assert num > 0
    series = []
    a, b = 1, 1
    while num > 0:
        series.append(a)
        a, b = b, a+b
        num -= 1
    print(series)


times = int(input('Enter the number for fib generaton: '))
fib_series(times)