再帰と反復の概要と一般的な例 (C++ と Python での実装)
再帰の核となる考え方は、確かに「分割統治」として要約できます。再帰は通常、問題が著しく自己相似であり、より小さな部分問題に効率的に分解できる場合に最も効果的です。問題を効率的に分解できない場合、または部分問題間に大量の重複がある場合、再帰の使用は最適な解決策ではない可能性があります。
再帰関数には通常、再帰をいつ停止するかを示す「終了条件」が必要です。関数がそれ自体を呼び出すときは、「終了条件」に段階的に近づくことができるように、引数は毎回処理可能な小さなデータ セットである必要があります。
理論的には、再帰的な問題は反復を使用して解決でき、その逆も同様です。これは、再帰と反復はどちらも繰り返しの操作が必要な問題を解決するために使用されるプログラミング手法ですが、実装と効率が異なる場合があるためです。
反復アルゴリズムは、一連の操作を繰り返し実行することで、問題の解決策に徐々に近づきます。プロセスの各反復は「反復」と呼ばれます。プログラミング手法では、特定の条件が満たされるまで一連の命令が繰り返し実行されます。反復は通常、for ループや while ループなどのループ構造を通じて実装されます。
再帰関数の使用例をいくつか示します。
1. 1 からn までの整数の合計を計算します。
★C++で実装された再帰的アルゴリズム:
#include <iostream>
using namespace std;
int recursiveSum(int n) {
if (n == 0) { // 终止条件
return 0;
} else {
return n + recursiveSum(n - 1); // 递归调用
}
}
int main() {
int n;
cout << "请输入一个正整数: ";
cin >> n;
int sum = recursiveSum(n); // 调用递归函数计算和
cout << "从1到" << n << "的所有整数的和为: " << sum << endl;
return 0;
}
★Pythonでの再帰的アルゴリズム実装コード:
def recursiveSum(n):
if n == 0:
return 0
else:
return n + recursiveSum(n - 1); # 递归调用
n = int(input("请输入一个正整数: "))
sum = recursiveSum(n) # 调用递归函数计算和
print(f"从1到{n}的所有整数的和为: {sum}")
★反復アルゴリズムは C++ で実装されています。
#include <iostream>
using namespace std;
int iterativeSum(int n) {
int sum = 0;
for(int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
int main() {
int n;
cout << "请输入一个正整数: ";
cin >> n;
int sum = iterativeSum(n); // 调用递归函数计算和
cout << "从1到" << n << "的所有整数的和为: " << sum << endl;
return 0;
}
★反復アルゴリズムは Python で実装されています。
def iterativeSum(n):
result = 0
while n > 0:
result += n
n -= 1
return result
n = int(input("请输入一个正整数: "))
sum = iterativeSum (n) # 调用递归函数计算和
print(f"从1到{n}的所有整数的和为: {sum}")
2.階乗を計算する
階乗:
階乗は、正の整数 n と n 以下のすべての正の整数を乗算した結果です。記号は通常、記号「!」で表されます。たとえば、5の階乗は5!と表され、計算式は5! = 5 × 4 × 3 × 2 × 1 = 120となります。階乗は再帰的または反復的に計算できます。
★C++で実装された再帰的アルゴリズム(キーコード):
int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
この例では、factorial(n) 関数は、それ自体を再帰的に呼び出すことによって n の階乗を計算します。基本的なケースは n == 0 で、この場合、関数は 1 を返します。再帰的な場合、関数は n *階乗(n - 1) を返します。これは、n の階乗の定義です。
★再帰はPythonで実装されています(キーコード):
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
★反復アルゴリズムは C++ (キーコード) で実装されています。
int factorial(int n) {
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
★反復アルゴリズムはPythonで実装されています(キーコード):
def factorial_iterative(n):
result = 1
for i in range(1, n+1):
result *= i
return result
3.フィボナッチ数列を計算する
フィボナッチ数列:
フィボナッチ数列は 0 と 1 から始まり、後続の各項は前の 2 つの項の合計になります。つまり、n 番目のフィボナッチ数は、n-1 番目のフィボナッチ数と n-2 番目のフィボナッチ数の和に等しくなります。フィボナッチ数列の最初のいくつかの数値は、0、1、1、2、3、5、8、13、21、...です。フィボナッチ数列は再帰的または反復的に生成できます。
★C++で実装された再帰的アルゴリズム(キーコード):
int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
この例では、 fibonacci(n) 関数は、それ自体を再帰的に呼び出すことによって、フィボナッチ数列の n 番目の項を計算します。基本的な状況は n <= 1 であり、この場合、関数は n を返します。再帰的な場合、関数は fibonacci(n - 1) + fibonacci(n - 2) を返します。これは、フィボナッチ数列の定義です。
★Pythonで実装された再帰的アルゴリズム(キーコード):
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
★反復アルゴリズムは C++ (キーコード) で実装されています。
int fibonacci(int n) {
if (n <= 0) {
return n;
} else {
int a = 0, b = 1, c;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
}
★反復アルゴリズムはPythonで実装されています(キーコード):
def fibonacci(n):
if n <= 0:
return n
else:
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b