Python斐波纳契生成器

问题描述 投票:14回答:15

我需要制作一个程序,询问打印的Fibonacci数量,然后将它们打印出来,如0,1,1,2 ...但我无法让它工作。我的代码看起来如下:

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 fibonacci naming-conventions
15个回答
27
投票

我会用这个方法:

Python 2

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

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)))

2
投票

要使用生成器获得斐波那契数字直到任意数字(在这种情况下为100),您可以执行此操作。

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)

2
投票

Python是一种动态类型语言。变量的类型在运行时确定,并且可以在执行过程中变化。首先,您已声明a保持整数类型,之后您已为其分配了一个函数,因此其类型现在变为函数。

你试图将'a'作为参数应用于range()函数,它需要一个int arg但你实际上提供了一个函数变量作为参数。

纠正的代码应该是

 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(),

这会奏效


1
投票

我刚刚建立了这个:

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会随着时间的推移而增长,所以它不是一个完美的解决方案。


1
投票

看起来你正在使用a两次。尝试将其更改为其他变量名称。

以下似乎对我有用。

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
投票

我喜欢这个版本:

array = [0,1]

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

0
投票

以下是斐波那契生成的两种解决方案:

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)

24
投票

你给a太多的含义:

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

a = fib()       

如果为变量提供更具描述性的名称(在10行代码中使用名称a的3种不同用途),您将不会遇到问题(通常):

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

并将range(a)改为range(amount)


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

.....


2
投票

你的a就是一个全球名称。

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

每当Python看到a时,它认为你在谈论上面的那个。把它叫做别的(别处或这里)应该会有所帮助。


2
投票

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

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

2
投票

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

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

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

2
投票

你有正确的想法和一个非常优雅的解决方案,你需要做的就是你交换和添加a和b的声明。您的收益表也应该在您的掉期之后

a, b = b, a + b ####应该是a,b = a+b,a #####

`###yield a`

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

2
投票

Simple way to print Fibonacci series till n number

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 :  "))
© www.soinside.com 2019 - 2024. All rights reserved.