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

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

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

ジェネレーターを書いているのですから、追加のシャッフルを省くために、2 つの yield を使用してみませんか?

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 に答える
5

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

int 引数を期待する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(),

これはうまくいきます

于 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 に答える
2

また、enumerateinfinitegeneratorを使用することもできます。

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

また、閉じた形式のソリューションを試すこともできます (丸め/オーバーフロー エラーのため、n の値が非常に大きい場合は保証されません)。

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

デフォルト fib(n):
    return int((pow(ratio, n) - pow(1 - ratio, n))/root5)
于 2010-10-17T18:03:47.827 に答える
2

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

a, b = b, a + b ####する必要がありますa,b = a+b,a #####

`###yield a`
于 2012-06-29T16:23:29.610 に答える
2

あなたaはいわば世界的な名前です。

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

Python が を見たときはいつでもa、あなたが上記のものについて話していると考えます。それを別のもの(他の場所またはここ)と呼ぶと役立つはずです。

于 2010-10-17T15:07:56.293 に答える
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

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

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

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 に答える
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時間の経過とともに大きくなるため、完全なソリューションではありません。

于 2010-10-17T15:34:28.183 に答える