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

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

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

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

Q&A

解決済

2回答

743閲覧

フィボナッチ数列について

yasutin

総合スコア41

Python 3.x

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

0グッド

0クリップ

投稿2022/12/03 04:06

前提

フィボナッチ数列のn番目の数字を計算する関数を再帰を用いずに定義したいです。
関数名:fibonacci_norec(n)

実現したいこと

非再帰のフィボナッチ数列関数を定義する。

発生している問題・エラーメッセージ

UnboundLocalError: local variable 'F_n' referenced before assignment

該当のソースコード

python

1def fibonacci_norec(n): 2 li = [1,1] 3 c = 0 4 if n == 1 or n == 2: 5 F_n = 1 6 else: 7 for i in range(2,n+1): 8 k = li[c] + li[c+1] 9 li.append(k) 10 c += 1 11 if c == n+1: 12 F_n = li[n-1] 13 break 14 return F_n

試したこと

ローカル変数がなぜ割り当てられていないのか条件分岐の条件を変えて実行してみましたが、結局わからないです。

補足情報(FW/ツールのバージョンなど)

jupyter notebook

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

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

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

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

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

Zuishin

2022/12/03 04:21

呼び出していないからでは?
melian

2022/12/03 04:27

#if c == n+1: if c == n-1:  F_n = li[n-1]
meg_

2022/12/03 08:48

引数に何を設定したときに質問のエラーが発生しましたか?関数を呼び出したコードも合わせて掲載してください。
guest

回答2

0

ベストアンサー

この関数の定義だと、

python

1 if c == n+1: 2 F_n = li[n-1] 3 break

この if 文が絶対に成立しません。その場合、 2より大きな値で呼んだときにF_n が未定義なのでエラーになります。
なぜ成立しないかは、5くらいの数のときに丁寧に追うとわかるでしょう。
ここは、

python

1 if c == n-1:

とすべきです。

また、動かしてみるとわかりますが、数列の添字は1始まりで、配列の添字は0始まりで1違いますので、動かすと1つ多いのがわかるでしょう。


おまけ
思うに、単にインデックスを取るためにあるので、変数cは不要です。
代わりにインデックスとして、「i」を使います。

python

1def fibonacci_norec(n): 2 li = [1,1] 3 if n == 1 or n == 2: 4 F_n = 1 5 else: 6 for i in range(2,n): 7 k = li[i-2] + li[i-1] 8 li.append(k) 9 if i == n-1: 10 F_n = li[n-1] 11 break 12 return F_n

おまけ2
さらに改良の余地があります。

  • ループは最後まで回ると抜けるので、最後までまわった判定をするのは不要
  • リストに結果をすべて残してありますが、目的の番目の値しか使わないのであれば、spoofy_dragonさんの回答のように最後の2つだけ取っておくので充分となります。 これは大きな値(百万番目とか)を計算したいときに影響あります。

投稿2022/12/03 05:22

TakaiY

総合スコア12765

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

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

yasutin

2022/12/03 15:28

丁寧に回答していただき大変わかりやすかったです。ありがとうございました!
guest

0

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

上記の関数では、数列の最初の2つの数字を変数aとbに格納します。次に、for文を使って、n回繰り返します。そのとき、aとbの値を更新します。つまり、aにbの値、bにa + bの値を代入します。最後に、aの値を返します。

投稿2022/12/03 04:44

dark-eater-kei

総合スコア1248

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問