質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2158閲覧

python フィボナッチを自力で説いてみたらとんでもないコードになっていたことが発覚!?

garchomp

総合スコア128

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/06/03 10:51

ご覧いただきありがとうございます。

フィボナッチを説いてみたのですが、特別支援学級にいたため難しい数学の四季とかよくわからなかったので、勘でコードを書いて見ました。

すると以下のようになりました(以下のコードの引数は100万にしてあります)

python

1def fibonatti(n): 2 a=1 3 b=0 4 x=0 5 total=0 6 for i in range(0,n): 7 total=a+b 8 a=total 9 b=x 10 x=total 11 print(total) 12 13fibonatti(1000000)

計算は(a+b)しかしておらず、ソレ以外は代入、代入、代入・・・だけです!(ぇ)

仕組みは、まずは出だし用として先にa=1とし、その後計算用にb、一階遅れての代入用にxも用意し、一旦そこにtotalを代入してから、次の週でxに格納した値をbに代入する・・・

でも、このような邪道的なやり方はあまりよろしくないでしょうか?

ちなみに表示されるまでの処理速度は20秒ぐらいでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwamoto_takaaki

2017/06/03 11:27

誰かのコードを普通級にいられなかったとかやつの書くコードとか、邪道だとかコメントしているものがあるのでしょうか?そのような人かもしれないと思われたと考えると不快です。 「書き方に自信がないので、添削してください。」とか普通の質問の仕方があるはずです。
guest

回答2

0

ちょっと無駄になっている部分を整理して、意味が通じるように変数名とかも変えるとフィボナッチ数列の定義通りに計算していることがわかります。

Python

1def fibonatti(n): 2 fib_0 = 0 # fib(0) 3 fib_1 = 1 # fib(1) 4 5 fib_n_1 = fib_1 # fib(n-1)でn=2のとき 6 fib_n_2 = fib_0 # fib(n-2)でn=2のとき 7 for i in range(0, n): 8 fib_n = fib_n_1 + fib_n_2 # fib(n) = fib(n-1) + fib(n-2) 9 print(fib_n) 10 # 次の計算の為の準備のため、f(n)をひとつ進める 11 fib_n_2 = fib_n_1 # nを一つずらす 12 fib_n_1 = fib_n # nを一つずらす

順番とかもちょっといじってますが、やっていることは同じです。適当に書いたといいますが、間違いではありません。ただ、自分で何をしているのかわからないとなるのであれば、変数名を自分で意味が通じるようにつけるとすると、数式通りに正しいか確認できると思います。

フィボナッチ数列は漸化式といわれるもののひとつで、いくつかの初期値が与えられ、現在の値が前のいくつかの値から求められる物です。このような漸化式で表される数式は、その漸化式自体の数列と、前の値を入れていく代入のみを繰り返すことで求める事が可能になります。

投稿2017/06/03 11:49

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

garchomp

2017/06/03 11:54

回答ありがとうございます! なるほど・・・処理の流れは理解できていたのですが、このようにして書いてみると、パッと見どのような処理をしているのか、変数名からでも察することができるようになるのですね・・・ 英語はとても苦手ですが、変数の付け方から気をつけられるように意識します!
guest

0

ベストアンサー

邪道ではありません。
フィボナッチに必要な演算は一回の加算だけなので普通です。
代入回数はもっと減らせます。

追記

数列であることを明確にするためにリストを使って書いてみました。

Python

1def fibonatti(n): 2 a=[0, 1, 1] 3 for i in range(0,n): 4 print(a[1]) 5 a[0]=a[1] 6 a[1]=a[2] 7 a[2]=a[0]+a[1]

投稿2017/06/03 11:19

編集2017/06/03 13:22
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

garchomp

2017/06/03 11:27

回答ありがとうございます! 工夫を凝らしていくのもまた大事なんですね・・・! 少しずつ出来r回答の数を増やしてみます!
garchomp

2017/06/03 15:24

これはわかりやすい! 配列化することで無駄な変数名の記述が減り、インデックスはおなじみなのでスッキリとわかりやすくなった気がします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問