[解決済み] フィボナッチ数列の書き方は?
質問内容
私は当初、プログラムを間違ってコーディングしていました。ある範囲内のフィボナッチ数を返すのではなく(例えば、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 頑張って、楽しんでください。
関連
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
opencvとpillowを用いた顔認証システム(デモあり)
-
Pythonコンテナのための組み込み汎用関数操作
-
python implement mysql add delete check change サンプルコード
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
任意波形を生成してtxtで保存するためのPython実装
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。