再帰関数の静的変数なしでの実装方法


  1. 再帰関数のパラメータを使用する方法: 再帰関数に必要な状態を保持するために、パラメータを使用することができます。例えば、再帰関数が数列の要素を合計する場合、再帰呼び出しのたびに合計値を引数として渡すことができます。

    def sum_recursive(numbers, index, total):
       if index == len(numbers):
           return total
       else:
           return sum_recursive(numbers, index + 1, total + numbers[index])
    numbers = [1, 2, 3, 4, 5]
    result = sum_recursive(numbers, 0, 0)
    print(result)  # 結果: 15

    上記の例では、再帰関数sum_recursivenumbersリストの要素を合計するためにindextotalの2つのパラメータを使用しています。

  2. 再帰関数内での戻り値の利用: 再帰関数が自身を呼び出した結果を利用することもできます。再帰呼び出しの戻り値を変数に代入し、後続の処理で使用します。

    def factorial_recursive(n):
       if n == 0 or n == 1:
           return 1
       else:
           return n * factorial_recursive(n - 1)
    result = factorial_recursive(5)
    print(result)  # 結果: 120

    上記の例では、再帰関数factorial_recursiveは階乗を計算するために自身を呼び出し、戻り値をnに乗算しています。

  3. 再帰関数内でのリストや集合の操作: 再帰関数内でリストや集合を操作する場合、スライスやフィルタリングなどの操作を使用して、新しいオブジェクトを生成することができます。

    def find_even_numbers(numbers):
       if len(numbers) == 0:
           return []
       else:
           current_number = numbers[0]
           remaining_numbers = numbers[1:]
           if current_number % 2 == 0:
               return [current_number] + find_even_numbers(remaining_numbers)
           else:
               return find_even_numbers(remaining_numbers)
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    result = find_even_numbers(numbers)
    print(result)  # 結果: [2, 4, 6, 8, 10]

    上記の例では、再帰関数find_even_numbersは与えられたリストから偶数の要素を見つけるために再帰的に呼び出され、新しいリストを生成しています。

再帰関数は、関数が自身を呼び出すことによって処理を繰り返す方法です。静的変数を使用すると、再帰関数の状態を保持することができますが、静的変数はコードの複雑さを増やす可能性があります。ここでは、静的変数を使用せずに再帰関数を実装する方法について説明します。

  1. 再帰関数のパラメータを使用する方法: 再帰関数に必要な状態を保持するために、パラメータを使用することができます。例えば、再帰関数が数列の要素を合計する場合、再帰呼び出しのたびに合計値を引数として渡すことができます。

    def sum_recursive(numbers, index, total):
       if index == len(numbers):
           return total
       else:
           return sum_recursive(numbers, index + 1, total + numbers[index])
    numbers = [1, 2, 3, 4, 5]
    result = sum_recursive(numbers, 0, 0)
    print(result)  # 結果: 15

    上記の例では、再帰関数sum_recursivenumbersリストの要素を合計するためにindextotalの2つのパラメータを使用しています。

  2. 再帰関数内での戻り値の利用: 再帰関数が自身を呼び出した結果を利用することもできます。再帰呼び出しの戻り値を変数に代入し、後続の処理で使用します。

    def factorial_recursive(n):
       if n == 0 or n == 1:
           return 1
       else:
           return n * factorial_recursive(n - 1)
    result = factorial_recursive(5)
    print(result)  # 結果: 120

    上記の例では、再帰関数factorial_recursiveは階乗を計算するために自身を呼び出し、戻り値をnに乗算しています。

  3. 再帰関数内でのリストや集合の操作: 再帰関数内でリストや集合を操作する場合、スライスやフィルタリングなどの操作を使用して、新しいオブジェクトを生成することができます。

    def find_even_numbers(numbers):
       if len(numbers) == 0:
           return []
       else:
           current_number = numbers[0]
           remaining_numbers = numbers[1:]
           if current_number % 2 == 0:
               return [current_number] + find_even_numbers(remaining_numbers)
           else:
               return find_even_numbers(remaining_numbers)
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    result = find_even_numbers(numbers)
    print(result)  # 結果: [2, 4, 6, 8, 10]

    上記の例では、再帰関数find_even_numbersは与えられたリストから偶数の要素を見つけるために再帰的に呼び出され、新しいリストを生成しています。