再帰は関数定義で使用されるプログラミング概念であり、関数がそれ自体を呼び出すことができることを意味します。再帰関数には、再帰呼び出しが停止する基本条件 (または終了条件) が必要です。この終了条件がないと、再帰が無限に継続し、最終的にはプログラムがクラッシュします。
プログラミングでは、再帰は、より小さく単純なサブ問題に分解できる問題を解決するためによく使用されます。再帰関数は、大きな問題を小さなサブ問題に分割し、それ自体を呼び出してそれらのサブ問題を解決します。
階乗を計算する C++ コードの例:
この例ではfactorial()
関数は再帰関数です。 n
が 0 に等しい場合、関数は再帰の終了条件である 1 を返します。それ以外の場合、関数はそれ自体を再帰的に呼び出し、 n
の階乗を計算します。再帰呼び出しごとに、 が 0 になるまで n
が 1 ずつ減分されます。 n
#include <iostream>
int factorial(int n) {
if (n == 0) { // 终止条件
return 1;
} else { // 递归调用
return n * factorial(n - 1);
}
}
int main() {
int n;
std::cout << "请输入一个正整数:";
std::cin >> n;
std::cout << n << "的阶乘是:" << factorial(n) << std::endl;
return 0;
}
C++ を使用してフィボナッチ数列を実装するコード:
このプログラムでは、フィボナッチ数列の各項を計算するための再帰関数 fibonacci
を定義します。 n
が 1 以下の場合、関数は直接 n
を返します。それ以外の場合、関数は fibonacci(n-1)
と fibonacci(n-2)
を再帰的に呼び出して次の項目を計算し、2 つの値を加算して次の項目の値を取得します。 main
関数では、まず計算するフィボナッチ数列の項の数を入力し、次にループを使用して各項を反復処理して出力します。
#include <iostream>
int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
int main() {
int n;
std::cout << "请输入要计算的斐波那契数列的项数:";
std::cin >> n;
std::cout << "斐波那契数列的前" << n << "项为:" << std::endl;
for (int i = 0; i < n; i++) {
std::cout << fibonacci(i) << " ";
}
std::cout << std::endl;
return 0;
}
再帰を使用してアスタリスクを出力する C++ プログラム:
#include <iostream>
void printStars(int n) {
if (n == 0) { // 递归终止条件
return;
}
std::cout << "*"; // 输出一个星号
printStars(n - 1); // 递归调用函数
}
int main() {
int n;
std::cout << "请输入要输出的星号行数:";
std::cin >> n;
printStars(n);
return 0;
}
上記のプログラムでは、printStars()
関数は再帰を使用して、指定された行数のアスタリスクを出力します。 n
が 0 に等しい場合、再帰は終了します。それ以外の場合、プログラムはアスタリスクを出力し、 printStars()
関数を再帰的に呼び出し、 が 0 になるまで n
を毎回 1 ずつ減らします。 。 関数では、標準入力から出力するアスタリスクの行数を読み取り、 関数を呼び出して指定された行数を出力します。アスタリスク。 n
main()
printStars()
ヤン・フイの三角形を解く
この種の問題の解決策は、図 1 から図 2 に移行できます。図 2 は、図 1 に各数字の後に追加のスペースを追加し、各行の前に追加のスペースを追加したものです。
それは、図の右側の分析からわかります。再帰関数と終了条件。 i は行、j は列です。再帰関数では、n は行、m は列です。
以下の図 1 に示すように。シンプルなヤン・ホイの三角形のイラストです。
図 1 プログラム ソリューション。手順は次のとおりです。
#include <iostream>
using namespace std;
int y(int n,int m)
{
if(m==1||m==n){
return 1;
}
return y(n-1,m-1)+y(n-1,m);
}
int main() {
int m, n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cout<<y(i,j)<<" ";
}
cout<<"\n";
}
return 0;
}
5を入力します。操作結果:
写真2に示すように。複雑なヤン・ホイの三角形のイラストです。
手順は次のとおりです。
#include <bits/stdc++.h>
using namespace std;
int y(int n,int m)
{
if(m==1||m==n){
return 1;
}
return y(n-1,m-1)+y(n-1,m);
}
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int k=n-i;k>=1;k--){
cout<<" ";
}
for(int j=1;j<=i;j++){
cout<<setw(5)<<y(i,j)<<" ";
}
cout<<"\n";
}
return 0;
}
20を入力してください。操作結果: