印刷されるフィボナッチ数を求め、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 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)))
a
に与えている意味が多すぎます。
_a = int(raw_input('Give amount: '))
_
vs.
_a = fib()
_
変数にわかりやすい名前を付けると、(頻繁に)問題が発生することはありません(10行のコードでa
の3つの異なる使用法!):
_amount = int(raw_input('Give amount: '))
_
range(a)
をrange(amount)
に変更します。
ジェネレーターを作成しているので、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
.....
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)
また、閉じた形の解決策を試すこともできます(丸め/オーバーフローエラーのためにnの非常に大きな値を保証するものではありません)。
root5 = pow(5、0.5) ratio =(1 + root5)/ 2 def fib(n): return int ((pow(ratio、n)-pow(1-ratio、n))/ root5)
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
は、いわばグローバル名です。
a = int(raw_input('Give amount: '))
Pythonがa
を見たときはいつでも、それはあなたが上記のものについて話していると思います。それを別の場所(ここか他の場所)と呼ぶと助けになるでしょう。
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(),
これはうまくいく
あなたは正しいアイデアと非常にエレガントなソリューションを持っていました、修正する必要があるのは、aとbのステートメントを交換して追加することだけです。あなたの利回り声明はあなたのスワップの後に行くべきです
a, b = b, a + b ####
はa,b = a+b,a #####
`###yield a`
また、列挙型無限ジェネレーターを使用できます。
for i,f in enumerate(fib()):
print i, f
if i>=n: break
私はこのバージョンが好きです:
array = [0,1]
for i in range(20):
x = array[0]+array[1]
print(x)
array[0] = array[1]
array[1] = x
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
を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())
私はこれを少し前にビルドしました:
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 = 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))
フィボンッチを生成するための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)