30

我需要制作一个程序来询问打印的斐波那契数字的数量,然后将它们打印为 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(),
4

20 回答 20

46

我会使用这种方法:

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

蟒蛇 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)))
于 2010-10-17T17:35:00.750 回答
27

你给出a了太多的含义:

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

对比

a = fib()       

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

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

并更改range(a)range(amount).

于 2010-10-17T15:03:18.290 回答
16

既然你正在编写一个生成器,为什么不使用两个产量,以节省做额外的洗牌?

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

......

于 2010-10-17T20:58:03.483 回答
9

使用生成器非常简单:

def fin(n):
    a, b = 0, 1

    for i in range(n):
        yield a
        a, b = b, a + b


ln = int(input('How long? '))
print(list(fin(ln))) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...]
于 2021-03-24T21:32:34.110 回答
5

Python 是一种动态类型语言。变量的类型是在运行时确定的,它可以随着执行的进行而变化。在这里,你首先声明了一个整数类型,后来你给它分配了一个函数,所以它的类型现在变成了一个函数。

您正在尝试将“ 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(),

这会起作用

于 2010-10-17T15:19:46.873 回答
3
def fibonacci(n):
    fn = [0, 1,]
    for i in range(2, n):
        fn.append(fn[i-1] + fn[i-2])
    return fn
于 2015-09-11T09:42:55.307 回答
3

要使用生成器获取斐波那契数直到任何数字(在本例中为 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)
于 2015-10-04T05:27:18.710 回答
3
def genFibanocciSeries():

    a=0
    b=1
    for x in range(1,10):
        yield a
        a,b = b, a+b

for fib_series in genFibanocciSeries():
    print(fib_series)
于 2019-11-25T07:34:22.867 回答
2

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

for i,f  in enumerate(fib()):
    print i, f
    if i>=n: break
于 2010-10-17T17:37:47.547 回答
2

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

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

`###yield a`
于 2012-06-29T16:23:29.610 回答
2

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

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

定义纤维(n):
    return int((pow(ratio, n) - pow(1 - ratio, n))/root5)
于 2010-10-17T18:03:47.827 回答
2

a可以说是一个全球性的名字。

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

每当 Python 看到一个a,它就认为你在谈论上面的那个。将其称为其他东西(在其他地方或此处)应该会有所帮助。

于 2010-10-17T15:07:56.293 回答
2
a = 3 #raw_input

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

fs = fib_gen()
next(fs)
for i in range(a):
    print (next(fs))
于 2020-01-26T06:25:23.910 回答
1

I've build this a while ago:

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

No that fab will grow over time, so it isn't a perfect solution.

于 2010-10-17T15:34:28.183 回答
1

我喜欢这个版本:

array = [0,1]

for i in range(20):
   x = array[0]+array[1]   
   print(x)
   array[0] = array[1]
   array[1] = x
于 2017-10-19T21:45:02.687 回答
1

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

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 :  "))
于 2017-08-01T09:03:09.453 回答
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())
于 2017-09-06T21:40:43.613 回答
0

你为什么要在这里复杂是我要研究的片段之一!

n = int(input('Enter your number..: '))
a = 0
b = 1
c = 0
print(a)
print(b)
for i in range(3, n+1):
    c = a+b
    print(c)
    a,b=b,c 

看看我的 git - rohith-sreedharan

于 2021-11-17T01:35:45.490 回答
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)
于 2019-03-22T03:45:08.853 回答
-1

我们可以在不通过 'yield 和 'next' 语句的情况下快速使用它

def fib(n):
    return n if n <= 1 else fib(n - 1) + fib(n - 2)
于 2021-06-01T09:33:31.587 回答