こんにちは。
今回は Python のうち関数に関する練習問題を行いたいと思います。
課題としては python を利用してフィボナッチ数列のコードを実装する内容となります。
フィボナッチ数列とは
- 1番目の数は1
- 2番目の数は1
- 3番目以降の数値は「前の数値と前の前の数値の和」
以下が仕様になります。
仕様
- まず、フィボナッチ数列の関数を定義します。
- 1番目、2番目の数は1にして、3番目以降の数は上記の様に「前の数値と、前の前の数値の和」とします。
- while構文を使用して、また return を利用して再帰的な構文にしてください。
- 「フィボナッチ数列のうち何番目の数値を表しますか」という入力を出来る様にしてください。
- 入力した数値でフィボナッチ数列を計算する関数を実行してください。
ここで、「再帰的な関数」という言葉が出てきました。
再帰的な関数とは
再帰的な関数というのは、例えば fib_func(n)
という関数が合った時に、return fib_func(n-1)
という様に、その関数自体を用いて return に指定することを言います。
では早速コーディングしていきましょう。
コーディングできれば、以下の解説で確認してください。
実装の手順
関数を定義してwhile構文を用いて再帰的なコーディングを行います。
まず、フィボナッチ数列の関数を def fib_func(n):
として定義します。
その次にwhile構文とif
, elif
, else
を組み合わせてコーディングを行います。
In[]
1 2 3 4 5 6 7 | while True: if n == 1: return 0 elif n == 2: return 1 else: return fib_func(n-1) + fib_func(n-2) |
ここで、while
構文とif
, elif
, else
の使い方について復習しましょう。
まずは、if
, elif
, else
の違いに関する内容です。
1 2 3 4 5 6 | if [条件式①]: [条件式①がTrueのときに行う処理] elif [条件式②]: [elifの条件式②がTrueのときに行う処理] else: [if文の条件式①も、elifの条件式②もどちらもFalseのときに行う処理] |
if, elif, else の使い方は非常に頻用しますので、ここで一度上記のコードを確認しておいて下さい。
入力した値でフィボナッチ数列の値を計算する
あとは input
を用いて「フィボナッチ数列のうち何番目の数値を表すか」という入力に対しての出力をさせるコーディングを行えば終了となります。
1 2 3 | i = int(input("フィボナッチ数列のうち何番目の数値を表しますか")) print(fib_func(i+1)) |
まとめ|pythonでフィボナッチ数列を作る
最終的な実装例としては以下の様になります。
解答例①
In[]
1 2 3 4 5 6 7 8 9 10 11 12 | def fib_func(n): while True: if n == 1: return 0 elif n == 2: return 1 else: return fib_func(n-1) + fib_func(n-2) i = int(input("フィボナッチ数列のうち何番目の数値を表しますか")) print(fib_func(i+1)) |
実行例は以下の様になります。
Out[]
1 2 | フィボナッチ数列のうち何番目の数値を表しますか8 21 |
解答例②
解答のポイント
while
文を使用しない場合- この場合、
n==0
の考慮が必要となる
In[]
1 2 3 4 5 6 7 8 9 | def fib_func(n): if n == 0: return 0 elif n == 1: return 1 else: return fib_func(n - 1) + fib_func(n - 2) target_num = int(input('フィボナッチ数列のうち何番目の数値を表しますか : ') ) print(fib_func(target_num)) |
実行例は以下の様になります。
Out[]
1 2 | フィボナッチ数列のうち何番目の数値を表しますか : 15 610 |
今回はPythonで再帰的な方法を用いてフィボナッチ数列を作りましたが、その他にもフィボナッチ数列の求め方には色々な作成方法があります。
そのほかの方法についてもご自身で色々と試してみましょう。
今回は以上となります。
補足事項:読者の方から頂いたご質問
Question
「1~10の素数を表示」を例にします。
上図が正解。
下の図が最後のインデントを削除した場合の結果です。
for文、if文からも外れることになるので、この10が意味するものはなにかがわかりません。
Answer
10
が意味するのは、単にiに残った数字がループから抜けた後表示されているだけですね。
i の値は 1,2,3,4,5,6,7,8,9,10
と変化して、それぞれif文の処理がされています。
ループが終わるとiの値は最後の10を保持しています。
それが print
されているだけですね。