関数fib(n)を以下のように定義していますが、別のプログラム内でfib(5)を呼び出した場合、処理が終了するまでに関数fib(n)は合計何回呼び出されるのでしょうか?解答と解説をお願いいたします。

与えられたfib(n)関数は、フィボナッチ数列のn番目の要素を再帰的に計算するためのものです。以下にfib(n)関数の定義を示します。

“`Python
def fib(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2)
“`

この関数が呼び出された場合、処理が終了するまでに関数fib(n)が呼び出される回数を求めるために、トレーステーブルを作成してみましょう。

“`
fib(5)
→ fib(4) + fib(3)
→ (fib(3) + fib(2)) + (fib(2) + fib(1))
→ ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
→ ((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0)) + (fib(1) + fib(0))
→ (1 + 0) + 1 + 1 + 0 + 1 + 0 + 1 + 0
→ 5
“`

このトレーステーブルを見ると、fib(5)を計算するためにはfib(4)、fib(3)、fib(2)、fib(1)、fib(0)の計算が必要です。また、個々の関数が再帰的に呼び出されることによって、同じ関数が複数回呼び出されることがわかります。

したがって、fib(5)を呼び出した場合、関数fib(n)は合計で5回呼び出されます。

ただし、上記の実装は効率的ではなく、再帰的な呼び出しのたびに重複した計算を行うため、大きな値のnに対しては非常に遅くなります。最適な効率性を持ちながら計算するためには、メモ化再帰(dynamic programming)や反復的アルゴリズムを使用することが推奨されます。

コメントを残す