問題

Python3において再帰関数を定義することを考える。このとき、再帰関数が正しく動作するために満たす必要がある条件は、次のうちどれですか。

選択肢

(a) ループ変数を初期化する

(b) 関数呼び出しを無限に行う

(c) ベースケースを定義する

(d) 関数内でグローバル変数を使用する

  • a
  • b
  • c
  • d

Python3 再帰関数を定義するための条件

答え

(c)

解説

正解は「ベースケースを定義する」です。

ベースケースとは再帰関数が自己呼び出しを終了する条件のことです。ベースケースが定義されていない場合、その関数は自己呼び出しを無限に続けることになり、スタックオーバーフローが発生します。

例えば、階乗を計算する再帰関数では、ベースケースは以下のように定義されます。(n=0または1のとき)

def factorial(n):
    # ベースケース: nが0または1の場合、1を返す
    if n == 0 or n == 1:
        return 1
    # 再帰呼び出し: n-1の階乗を計算
    else:
        return n * factorial(n - 1)

print(factorial(5))  # 120

一方で、以下のようにベースケースを定義せずに関数を呼び出すと、エラーが発生します。

def factorial(n):
    # 再帰呼び出しのみ: n-1の階乗を計算
    return n * factorial(n - 1)

print(factorial(5))  # 120

出力:

Traceback (most recent call last):
  File "Main.py", line 8, in <module>
    print(factorial(5))  # 120
  File "Main.py", line 6, in factorial
    return n * factorial(n - 1)
  File "Main.py", line 6, in factorial
    return n * factorial(n - 1)
  File "Main.py", line 6, in factorial
    return n * factorial(n - 1)
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

このことから、再帰関数の条件としてベースケースを定義する必要があることがわかりました。

【その他の選択肢】

ループ変数を初期化する
→ 再帰関数とループ(for文、while文など)は関係ありません。ループ変数の初期化とは、以下のコードのように、各繰り返しで変数iが10, 20, 30, と初期化される処理のことをいいます。

for i in [10, 20, 30, 40, 50]:
    print(i)

関数呼び出しを無限に行う
→ スタックオーバーフローが発生するため、誤りです。呼び出し回数は、必ず有限である必要があります。

関数内でグローバル変数を使用する
→ 再帰関数でグローバル変数を使用することは可能ですが、再帰関数の条件とは関係ありません。再帰関数を定義するときに、グローバル変数の使用は必須ではありません。

テスト一覧

スキルテストが提供しているテストの一覧です。ぜひ学習や実力チェックに役立ててください。