🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

673閲覧

フィボナッチ数列でユーザーが入力した数だけ出力する

Tohmas_1010

総合スコア15

Python 3.x

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

0グッド

1クリップ

投稿2019/09/21 05:25

編集2019/09/21 15:53
def gen_fib(): count = int(input("How many fibonacci numbers would you like to generate? ")) i = 1 if count == 0: fib = [] elif count == 1: fib = [1] elif count == 2: fib = [1,1] elif count > 2: fib = [1,1] while i < (count - 1): fib.append(fib[i] + fib[i-1]) i += 1 return fib

質問1:最後のelifから後なのですがiよりcountが大きい場合Trueの場合続ける。というのはわかりますが、なぜ-1をするのでしょうか?

質問2:fib.append(fib[i] + fib[i-1])
i += 1 ここの処理で1.1.2.3.5.8の処理をしているのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜ-1をするのでしょうか?

第1項、第2項は既知なので、第n項を求める際の計算回数がn-2回で済むから。

1を引いているのはカウンタ変数iの初期値を1にしているからです。
これを最初から2にしてしまえば while i < count で充分な筈。

fib.append(fib[i] + fib[i-1])

i += 1 ここの処理で1.1.2.3.5.8の処理をしているのでしょうか?

iにどんな値が入っていて、fib[i]とfib[i-1]が何を指しているのか確認すると良いです。

Python

1def gen_fib(): 2 count = 10 # とりあえず固定 3 i = 1 4 5 # elif count > 2: 6 fib = [1,1] 7 while i < (count - 1): 8 print(f'fib={fib}') 9 print(f'i={i}, fib[i]={fib[i]}, fib[i-1]={fib[i-1]}') 10 print() 11 12 fib.append(fib[i] + fib[i-1]) 13 i += 1 14 15 print(f'return: {fib}') 16 return fib 17 18 19gen_fib()

実行結果 Wandbox

fib=[1, 1] i=1, fib[i]=1, fib[i-1]=1 fib=[1, 1, 2] i=2, fib[i]=2, fib[i-1]=1 fib=[1, 1, 2, 3] i=3, fib[i]=3, fib[i-1]=2 fib=[1, 1, 2, 3, 5] i=4, fib[i]=5, fib[i-1]=3 fib=[1, 1, 2, 3, 5, 8] i=5, fib[i]=8, fib[i-1]=5 fib=[1, 1, 2, 3, 5, 8, 13] i=6, fib[i]=13, fib[i-1]=8 fib=[1, 1, 2, 3, 5, 8, 13, 21] i=7, fib[i]=21, fib[i-1]=13 fib=[1, 1, 2, 3, 5, 8, 13, 21, 34] i=8, fib[i]=34, fib[i-1]=21 return: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

余談

ご提示のコードは、あんまり良いお手本になるようには見えません。
再帰処理を避けるとしても、次のように書くのがより簡潔ではないでしょうか。

Python

1def make_fib(cnt): 2 fib = [1, 1] 3 for _ in range(cnt-2): 4 fib.append(fib[-1] + fib[-2]) 5 6 return fib[:cnt]

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
Python

特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

投稿2019/09/21 05:31

編集2019/09/21 05:47
LouiS0616

総合スコア35668

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

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

Tohmas_1010

2019/09/21 15:32 編集

ご説明いただきありがとうございます。 --------------------------- while i < (count - 1): fib.append(fib[i] + fib[i-1]) i += 1 --------------------------- fib =[1.1.n....]nに加える値をどこでどのように処理してるのかがわかりません???? fib[1]+ fib[1-1]=1 →i +=1される→fib[2]+ fib[2-1]=3→i+=1される この解釈自体が間違ってますか?
LouiS0616

2019/09/21 15:39

fibはリストです。 リストのappendメソッドを呼び出すと、要素を末尾に付け加えることができます。 例えば、こんなふうに。 lst = [1, 2, 3] lst.append(4) print(lst) # 出力=> [1, 2, 3, 4]
LouiS0616

2019/09/21 15:40

回答で指摘したとおり、質問文を編集して下さい。読みづらくてしょうがないです。
Tohmas_1010

2019/09/21 15:57

修正致しましたm(_ _)m そこはわかるのですが、なぜ fib.append(fib[i] + fib[i-1]) でfib = [1,1,2,3,5] という法則が作れるのかがわからないです。
LouiS0616

2019/09/21 21:46

tmp = fib[i] + fib[i-1] print(tmp) fib.append(tmp) とでもして確認してみて下さい。本質は一緒です。
Tohmas_1010

2019/09/22 04:51

fib=[1, 1] i=1, fib[i]=1, fib[i-1]=1 # [1]+[1-1]なのに、なぜ[1,1]に2が渡されるか fib=[1, 1, 2] i=2, fib[i]=2, fib[i-1]=1 # [2]+[2-1]=3なので3が加えられるのはわかる fib=[1, 1, 2, 3] i=3, fib[i]=3, fib[i-1]=2 # [3]+[3-1]=5なのでこれもわかる fib=[1, 1, 2, 3, 5] i=4, fib[i]=5, fib[i-1]=3 # i = 4なのに [4]+[4ではなく5-1]になってる意味が分からないです
LouiS0616

2019/09/22 06:59

ええと、次の実行結果は分かりますか? ちょっと頭の中で実行してみて下さい。 lst = [2, 7, 1, 8] print(lst[1]) print(lst[0]) print(lst[1] + lst[0])
Tohmas_1010

2019/09/22 08:02 編集

リストの1番目、0番目を足した結果が出力されるのは分かります!
LouiS0616

2019/09/22 07:57

それでは、これはどうでしょう。 lst = [2, 7, 1, 8] i = 1 print(lst[i] + lst[i-1])
Tohmas_1010

2019/09/22 08:02 編集

9ですね! なるほどですね! そのことを忘れていました。。。 fib[i]+fib[i-1] i番目とi-1番目を足した結果をappendするってことですね。
LouiS0616

2019/09/22 08:12

疑問が解消したようで何よりです。
Tohmas_1010

2019/09/22 08:30

ありがとうございました。 よく寝れそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問