繁体   English   中英

Python 斐波那契生成器

[英]Python Fibonacci Generator

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

我会使用这种方法:

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

你给出a太多的含义:

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

对比

a = fib()       

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

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

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

既然你正在编写一个生成器,为什么不使用两个 yields 来节省额外的 shuffle?

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

.....

使用生成器非常简单:

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, ...]

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

这会起作用

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

要使用生成器获得斐波那契数直到任何数字(在本例中为 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)
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)

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

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

`###yield a`

可以说,您的a是一个全球名称。

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

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

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

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

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

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

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

打印斐波那契数列直到 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 :  "))
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))

我不久前建立了这个:

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

看起来您正在使用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())

我喜欢这个版本:

array = [0,1]

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

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

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)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM