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

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

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

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

Q&A

解決済

3回答

1271閲覧

フィボナッチ数列作成関数中の再帰法の使い方の誤りを見つけたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2018/11/06 15:41

フィボナッチ数列を再帰法を用いて書きたい

フィボナッチ数列を再帰法を用いて作成するプログラムを作成したのですが、
出力がNoneになってしまいます。

該当のソースコード

Python3

1def culculate_fibonacci(number, kolist): 2 if number == 2: 3 return kolist 4 kolist.append(kolist[-1] + kolist[-2]) 5 number -= 1 6 culculate_fibonacci(number, kolist) 7 8a = culculate_fibonacci(100, [1,1]) 9print(a)

試したこと

最初はappendメソッドの戻り値がNoneであることから問題が生じている
のかと考えました。
そこで再帰法を使わない別のプログラムの関数内でappendを使ってみたところ
思った通りの結果が出たので、再帰法の使い方に誤りがあるのと考えました。
しかし、どこに問題があるかわからないため質問に至りました。

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

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

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

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

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

guest

回答3

0

引数のlistを使いまわして変更を加えていくので、こんな風に書けば良いです。

python

1def calculate_fibonacci(number, kolist): # スペルミス 2 if number == 2: 3 return 4 kolist.append(kolist[-1] + kolist[-2]) 5 number -= 1 6 calculate_fibonacci(number, kolist) 7 8l = [1, 1] 9calculate_fibonacci(100, l) 10print(l) 11""" => 12[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 676,... # 中略 13""" 14

質問文のコードだと返り値そのものはNoneになります(明示的にreturnされなければNoneが返る)。LouiS0616さんの回答を参考にされると良いと思います。

ただし、正しく[1, 1]を入れないと正常に動作しない関数は困りますから、たとえばこんなふうにしてみるといった改善が可能です。numberだけで呼べるようにしました。

python

1def calculate_fibonacci(number): 2 kolist = [1, 1] 3 def calculate_fibonacci_i(number, kolist): 4 if number == 2: 5 return 6 kolist.append(kolist[-1] + kolist[-2]) 7 number -= 1 8 calculate_fibonacci_i(number, kolist) 9 calculate_fibonacci_i(number, kolist) 10 11 return kolist

引数のデフォルト値を使うと、以下のようにも書けます。

python

1def calculate_fibonacci(number, kolist=None): 2 if kolist is None: 3 kolist = [1, 1] 4 if number == 2: 5 return kolist 6 kolist.append(kolist[-1] + kolist[-2]) 7 number -= 1 8 return calculate_fibonacci(number, kolist)

投稿2018/11/06 16:19

hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2018/11/07 10:57

回答ありがとうございます。大変参考になります。 少し疑問が残ったので追加で質問させていただきます。 hayataka2049さんに回答いただいた一番上のコードと私の コードは両方ともreturnが再帰の部分に書いていないのに、なぜ私の コードだけNoneが返ってきてしまうのでしょうか。 どうして私のコードはreturnが必要なのでしょうか。 よろしくお願いいたします。
hayataka2049

2018/11/07 12:08

私の上のコードにしろ、返り値はNoneです。 私のコードの場合は、返り値はハナから使わないことにして、引数に渡したリストに変更を加えることで結果を取り出しています。
退会済みユーザー

退会済みユーザー

2018/11/07 14:47

そのような使い方もできるのですね。 関数の使い方について一層理解が深まりました。 ありがとうございました。
guest

0

ベストアンサー

再帰呼び出しの結果をreturnしてやらないと、返り値が伝搬されません。

Python

1def culculate_fibonacci(number, kolist): 2 if number == 2: 3 return kolist 4 kolist.append(kolist[-1] + kolist[-2]) 5 number -= 1 6 return culculate_fibonacci(number, kolist) # ここ 7 8a = culculate_fibonacci(100, [1,1]) 9print(a)

投稿2018/11/06 15:46

LouiS0616

総合スコア35658

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

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

退会済みユーザー

退会済みユーザー

2018/11/07 12:03

回答ありがとうございます。 returnを入力したところ正しく動作しました。 しかし、なぜreturnを入れなければ正しく動いてくれないのか がまだはっきりと分かりません。 もし宜しければ教えていただいてもよろしいでしょうか
LouiS0616

2018/11/07 12:17

def func1():  return 1 def func2():  func1() print(func2()) このコードの実行結果は予想できるでしょうか。
退会済みユーザー

退会済みユーザー

2018/11/07 13:10

関数2の中で関数1が呼ばれreturnが1なので1が出力されると思いましたが、 やってみるとNoneでした。 def func2(): return func1() だと1でした。 関数の中で別の関数を呼び出しても、呼び出された方のreturn はもとの関数のreturnにはならないということでしょうか。
LouiS0616

2018/11/07 13:14

そういうことです。 やや語弊のある表現ではありますが、『関数の呼び出しはその結果に置き換えられる』というイメージをするとわりあい分かり易いかと思います。
退会済みユーザー

退会済みユーザー

2018/11/07 14:45

その考え方を使って、自分の書いたコードを見直した結果 Noneが返ってくる理屈がわかりました。 ありがとうございました。
guest

0

デバッグの仕方を学習すると良いです。

参考情報

  • PythonデバッグTips

https://qiita.com/TakesxiSximada/items/45b6d71a44f2706798ed

投稿2018/11/06 22:25

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2018/11/07 11:44

回答ありがとうございます。 一応VScodeでデバッグの機能を使っていたのですが、 解決できませんでした。 まだまだ使い方が甘いのかもしれません。デバッグについて もっと学んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問