web-dev-qa-db-ja.com

Pythonフィボナッチジェネレータ

印刷されるフィボナッチ数を求め、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(),
16
John

私はこの方法を使用します:

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

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

aに与えている意味が多すぎます。

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

vs.

_a = fib()       
_

変数にわかりやすい名前を付けると、(頻繁に)問題が発生することはありません(10行のコードでaの3つの異なる使用法!):

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

range(a)range(amount)に変更します。

24
unutbu

ジェネレーターを作成しているので、2つのイールドを使用して、余分なシャッフルを実行しないようにしてください。

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

.....

14
John La Rooy
def fibonacci(n):
    fn = [0, 1,]
    for i in range(2, n):
        fn.append(fn[i-1] + fn[i-2])
    return fn
3
Alex

ジェネレーターで任意の数(この場合は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
Hanzel

また、閉じた形の解決策を試すこともできます(丸め/オーバーフローエラーのためにnの非常に大きな値を保証するものではありません)。

 root5 = pow(5、0.5)
 ratio =(1 + root5)/ 2 
 
 def fib(n):
 return int ((pow(ratio、n)-pow(1-ratio、n))/ root5)
2
Patrick Krecker

フィボナッチシリーズを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 :  "))
2

あなたのaは、いわばグローバル名です。

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

Pythonがaを見たときはいつでも、それはあなたが上記のものについて話していると思います。それを別の場所(ここか他の場所)と呼ぶと助けになるでしょう。

2
Jungle Hunter

Pythonは動的に型付けされた言語です。変数のタイプは実行時に決定され、実行の進行に応じて変化する可能性があります。ここでは、最初に整数型を保持するように宣言し、後でそれに関数を割り当て、その型が関数になりました。

int argを期待するrange()関数の引数として 'a'を適用しようとしていますが、実際には引数として関数変数を指定しています。

修正されたコードは

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

これはうまくいく

2
appusajeev

あなたは正しいアイデアと非常にエレガントなソリューションを持っていました、修正する必要があるのは、aとbのステートメントを交換して追加することだけです。あなたの利回り声明はあなたのスワップの後に行くべきです

a, b = b, a + b ####a,b = a+b,a #####

`###yield a`
2
Jeremy

また、列挙型無限ジェネレーターを使用できます。

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

私はこのバージョンが好きです:

array = [0,1]

for i in range(20):
   x = array[0]+array[1]   
   print(x)
   array[0] = array[1]
   array[1] = x
1
Eirik Fesker
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)
1
Javaid Mir

aを2回使用しているようです。それを別の変数名に変更してみてください。

以下は私にとってはうまく機能しているようです。

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
domgreen

私はこれを少し前にビルドしました:

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
Martijn
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))
0
Yoga Rajan

フィボンッチを生成するための2つのソリューションを以下に示します。

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)
0
G.G.