1. ホーム
  2. python

[解決済み] フィボナッチ数列の書き方は?

2022-05-07 18:32:39

質問内容

私は当初、プログラムを間違ってコーディングしていました。ある範囲内のフィボナッチ数を返すのではなく(例えば、startNumber 1, endNumber 20 は 1 & 20 の間の数だけを表示する)、ある範囲内のすべてのフィボナッチ数を表示するように書いてしまいました(例えば、startNumber 1, endNumber 20 は = 最初の20個のフィボナッチ数)。私は確実なコードを持っていると思った。また、なぜこのようなことが起こるのかわかりません。

startNumber = int(raw_input("Enter the start number here "))
endNumber = int(raw_input("Enter the end number here "))

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

print map(fib, range(startNumber, endNumber))

私のパートIIで誰かが指摘した(重複しているため閉鎖された-)。 https://stackoverflow.com/questions/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii ) は、startNumber と endNumber を while ループを使用してジェネレーターに渡す必要があることを示しました。どなたか、この方法を教えていただけませんか?どんな助けでも歓迎します。


プログラマーを勉強中の者ですが、ちょっとごたごたに遭遇してしまいました。私は、ユーザーが入力した開始番号と終了番号によってフィボナッチ数列を計算し、表示するプログラムを書くように依頼されています(例えば、startNumber = 20 endNumber = 100で、その範囲の数字のみを表示する)。トリックは、これを包括的に使用することです(Pythonでこれを行う方法を私は知りません?- これは、包括的な範囲を使用することを意味すると思いますが?)

ここまでの内容は、実際のコーディングではなく

  • Fibシーケンス式で無限大に書く
  • FibシーケンスからstartNumberからendNumberのみを表示する。

どこから手をつけていいのか全く分からないので、これをどう書けばいいのか、アイデアや見識を求めているのです。また、Fibシーケンスのフォーラムラも書いてみましたが、これも迷ってしまいます。

どのように解決するのですか?

フィボナッチ数列に関する情報は、以下のサイトにたくさんあります。 ウィキペディア および ウォルフラム . あなたが必要とするよりも多くのことがあります。いずれにせよ、これらのリソースを利用して、必要なものを(できれば素早く)見つける方法を学ぶのは良いことです。

Fibシーケンス式で無限大に書く

数学では、再帰的な形で与えられる。

プログラミングで 無限 は存在しない。数学の形式を直接言語に翻訳した再帰的な形式を使用することができます。

def F(n):
    if n == 0: return 0
    elif n == 1: return 1
    else: return F(n-1)+F(n-2)

好きな言語で試してみて、このフォームには たくさん nが大きくなるにつれて、時間がかかる。実際、これはO(2 n )を時間単位で指定します。

私があなたにリンクしたサイトに行くと、これが表示されます(上の ウォルフラム ):

これはPythonで簡単に実装でき、計算も非常に高速です。

from math import sqrt
def F(n):
    return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))

もう一つの方法は、定義に従うことです(from ウィキペディア ):

シーケンスの最初の番号は0です。 2番目の数字を1、そして各数字を 以降の数値は、その和に等しい の前の2つの数値の という数列が得られます。 0, 1, 1, 2, 3, 5, 8, など。

もしあなたの言語がイテレータをサポートしているならば、次のようなことができるかもしれません。

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

FibシーケンスからstartNumberからendNumberまでを表示します。

フィボナッチ数の生成方法がわかったら、あとは数字を一巡させて、与えられた条件を満たしているかどうかをチェックするだけです。

ここで、フィボナッチ数列の n 番目の項を返す f(n) を書いたとします( sqrt(5) のようなものです )。

ほとんどの言語では、次のようなことができます。

def SubFib(startNumber, endNumber):
    n = 0
    cur = f(n)
    while cur <= endNumber:
        if startNumber <= cur:
            print cur
        n += 1
        cur = f(n)

pythonではイテレータ形式にしてforにします。

def SubFib(startNumber, endNumber):
    for cur in F():
        if cur > endNumber: return
        if cur >= startNumber:
            yield cur

for i in SubFib(10, 200):
    print i

私のヒントは 読むことを学ぶ 必要なもの。Project Euler (google for it) はそのためのトレーニングになります :P 頑張って、楽しんでください。