9

いくつかの基本的な機能を作成することで、プログラミングスキルを向上させようとしています。

リストにフィボナッチ値を入力したいのですが、コードはすべての数値をまとめて合計し、代わりにそれを出力すると思います..

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)

print numberlist

fibonaccinumbers = []

for n in numberlist:
    def fib(n):
        a, b = 0, 1
        for i in range(n):
            a, b = b, a + b
        return a
    a = fib(n)
    fibonaccinumbers.append(a)


print a

どこで間違ったのですか?

4

11 に答える 11

12
print a

さて、あなたは最終的な値を出力します。


また、コードに関するいくつかのコメント:

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)

そこで初期化する必要はありませiん。 for ループがそれを行います。また、これを行うだけでブロック全体を単純化できます。

numberlist = list(range(20))

そして、実際にはそれをリストにする必要がないことを考えると、それを構築する必要はまったくありませんが、for n in range(20)後で実行することができます.

次にfib、ループ内で関数を何度も再定義しています。その外側で定義し、再利用する必要があります。

また、複数のフィボナッチ数のリストを作成したいことがわかっている場合は、その間に計算したすべての数を保存するだけで役立ちます。そうすれば、同じことを何度も繰り返す必要はありません。ジェネレーター関数を使用して、すべてを簡単にすることもできます。

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

fibonaccinumbers = []
fib = fibGenerator()
for n in range(20):
    fibonaccinumbers.append(next(fib))

範囲を反復しnextてジェネレーターを手動で呼び出す代わりに、 itertools のtake-recipeを使用して、次のようにすることもできます。

fibonaccinumbers = take(20, fibGenerator())

発電機について

ただし、ジェネレーターが何をするのかはまだよくわかりません。

ジェネレーターは、一連の戻り値を生成する Python 関数です。値は遅延生成されます。つまり、要求したときに生成されます。yield代わりに を使用するだけでジェネレータを作成できますreturn。Ayieldは値を「返し」、ジェネレーターを一時停止します。次に値を要求すると、ジェネレーターは中断したところから続行します。

ジェネレーターを使用すると、無限のシーケンスを作成できます。上記の定義でわかるように、内部fibGeneratorを持つ無限の while ループがあります。yieldジェネレーターが停止すると、そのループにもかかわらずハングアップしません。

ここに簡単な自明の例があります:

>>> def example():
    print('begin')
    i = 0
    while True:
        print('Calculating next value')
        yield i
        i += 1

>>> g = example()
>>> next(g)
begin
Calculating next value
0
>>> next(g)
Calculating next value
1
>>> next(g)
Calculating next value
2
>>> next(g)
Calculating next value
3
>>> next(g)
Calculating next value
4

関数は、 iterableから次のnext値を要求する組み込み関数です。イテラブルとは、反復できるものです (例: )。また、任意のジェネレーターもイテラブルです。for x in iterable: ...

于 2013-03-09T00:00:41.653 に答える
2

問題は最後の行にあります。気を散らすものだと思います。リストを印刷する必要があります。ではなく、リストを印刷する必要がありますa

その他のヒント:

1:このブロック全体は、range:によって返されるリストを再作成しているだけです。

numberlist = []
i = 0
for i in range(20):
    numberlist.append(i)

割り当てi = 0も重要ではありません。代わりに、次を試してください。

numberlist = range(20)

Python 3では、本格的なリストが作成されないためlist(range(20))、を呼び出します。range

2:ループのすべてのパスで関数を再定義してfibも問題は発生しませんが、確かに必要ではありません。定義を外に移動します:)

于 2013-03-09T00:01:37.390 に答える
2

すみません、私はばかです。フィボナッチの最後の反復計算である「a」を印刷していました..

代わりにリストを印刷していたはずです。

くそ...

于 2013-03-08T23:58:06.810 に答える
2

プログラミングスキルを向上させるという精神で:ジェネレーターitertools.islice()nを使用して、最初のフィボナッチ数のリストを取得できます。

from itertools import islice

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

fibonacci_numbers = list(islice(fib(), 20))
print(fibonacci_numbers)

出力

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
于 2013-03-09T00:21:47.133 に答える
1

私はそれを要約し、「範囲」または少なくとも list(range()) が独自のリストを作成するという事実を取り入れました。

numberlist = list(range(20))

def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a

fibonaccinumbers = [fib(n) for n in numberlist]

print fibonaccinumbers

20回目の繰り返しまでのすべてのフィボナッチ値を出力して、うまくいくようです。次のような奇妙なことをせずに、def の外で「fib(n)」を呼び出すことができるのはどうしてですか。

a = fib(n)

それが以前の私が慣れ親しんだスタイルでした。いずれにせよ、今のプログラムはよさそうですか?

于 2013-03-09T00:27:57.040 に答える
1

フィボナッチ数列の n 番目の項は次のとおりです。

ここに画像の説明を入力 どこ ここに画像の説明を入力ここに画像の説明を入力

上記の ID を使用して、リスト内包表記を使用してシリーズを生成できます。

[int(((((1 + math.sqrt(5)) / 2) ** x) - (((1 - math.sqrt(5)) / 2) ** (x))) / math.sqrt(5)) for x in range(n)] //where n is the number of terms in the series
于 2014-02-18T19:33:33.073 に答える
0

各フィボナッチ数は以前のすべての数から生成されるため、それぞれをゼロから計算することは意味がありません。フィボナッチ数を収集しているリストを使用して、後続の各数を計算することをお勧めします。

def FibList(n):
    rc = []
    for i in xrange(n):
        if i < 2:
            rc.append(1)
        else:
            rc.append(rc[i-2] + rc[i-1])

    return rc

print FibList(20)

本当におしゃれになりたい場合は、フィボナッチ値を計算するジェネレーター関数を作成し、それを使用してリストを作成できます。

def Fib(n):
    n1 = 1
    n2 = 1

    for i in xrange(n):
        if i < 2:
            yield 1
        else:
            n3 = n1 + n2
            n1 = n2
            n2 = n3
            yield n3

fiblist = [x for x in Fib(20)]
print fiblist

ジェネレーター関数では、「yield」キーワードはリストの各値を返します。「リスト内包表記」と呼ばれるものを使用して、ジェネレーターを使用してリストを作成する行fiblist。ジェネレーターを for ループで使用することもできます。

for fnum in Fib(20):
    print fnum
于 2013-03-09T00:20:14.667 に答える
0

式を使用して、値を差し込んだだけです。

import math 

def Fibs(n):

 for i in range (n):

     Fn=int(((((1+math.sqrt(5))**i) - ((1-math.sqrt(5)) **i))/(2**i) * (math.sqrt(5)))/5)
     print (Fn)

Fibs(int(input())
于 2015-04-28T22:18:11.823 に答える
0

リスト内包表記を使用しないのはなぜですか? これが私が問題を解決する方法です。フィボナッチ数列のn番目の項を計算する関数を次のように定義します。

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

次に、リスト内包表記を使用して、必要なシーケンスを取得します。

fib_sequence = [fibo(i) for i in range(n+1)]
于 2018-09-24T22:39:50.620 に答える