再帰とは何ですか?
再帰とは、関数がそれ自体を呼び出すときです。
いわゆる再帰とは、再帰して戻ることです。再帰のみがプログラムのクラッシュを引き起こします!
必要に応じて再帰を終了するには(クラッシュを回避するために、再帰関数には条件ステートメントが含まれている必要があります)
例:
#定义一个递归函数
def f(x): //当x=3,调用函数
return x + f(x-1);
3 + f(2)を返し、f(2)は2 + f(1)を返し、f(1)は1 + f(0)を返します...関数を無限に呼び出す場合、スタックと呼ばれるメモリスペースを占有する必要があります。データはスタックに格納され、操作は終了し、データはスタックから取り出されますが、呼び出しのみが返されず、スタックがいっぱいになり、スタックがオーバーフローします。プログラムが終了しました!
#定义一个递归函数
def f(x): //x=3
if x > 0:
return x + f(x-1);
else:
return 0;
結果:6
#定义一个递归函数
def f(x): //x=100
if x > 0:
return x + f(x-1);
else:
return 0;
1 + 2 + 3 +4+…+100= 5050
関数の入れ子と再帰とは何ですか?
ある関数から別の関数への呼び出しは、関数のネストされた呼び出しと呼ばれます
別の状況があります:
関数の本体内で自分自身を関数と呼ぶ再帰呼び出し
再帰関数呼び出しの簡単な例、run(3)、run(2)、run(1)は、条件を置き換えて、それらが満たされているかどうかを判別します。
#include <stdio.h>
#include <stdlib.h>
void run(int num){
if(num==0)
return;
printf("蓝桥杯 我要获奖!\n");
run(num-1); //每递归一次,num减1,最终满足终止条件num==0,递归完成
}
void main(){
run(3); //先定义ー个函数,让它执行3次
}
蓝桥杯 我要获奖!
蓝桥杯 我要获奖!
蓝桥杯 我要获奖!
これらの2つの例を通して、関数のネストと再帰を理解する方がよいでしょうか。go関数はrun関数を呼び出し、run関数はmain関数を呼び出します。
#include <stdio.h>
#include <stdlib.h>
void go(){
printf("你可以的\n");
}
void run(){
printf("runA\n");
go();
printf("runB\n");
}
void main(){
printf("helloworld\n");
run();
printf("欢迎来到蓝桥杯\n");
}
helloworld
runA
你可以的
runB
欢迎来到蓝桥杯
ちょっとしたトリックがあります:再帰的な条件文に遭遇しました!
再帰的生成
分割統治によって生成されるサブ問題は、多くの場合、元の問題のより小さなパターンであり、再帰的手法の使用を容易にします。この場合、分割統治法を繰り返し適用することで、元の問題と同じタイプのサブ問題を作成できますが、その規模は継続的に縮小され、最終的にサブ問題は簡単になるまで縮小されます。その解決策を直接見つけるために。これは当然、再帰的なプロセスにつながります。
再帰的アプリケーション
問題の定義は、階乗問題のように再帰的です。
ハノイの塔の問題のように、問題解決プロセスは再帰的です。
問題で使用されるデータ構造は、リンクリスト内のリンクリスト内の要素を検索するなど、再帰的です。
再帰的な数式
これは一連の方程式または不等式です。
その最初の式は、境界条件と呼ばれる関数の初期値を示します。
境界条件と再帰方程式は、再帰の2つの基本要素です。
2番目の式は、小さい方の独立変数の関数値を使用して、大きい方の独立変数の関数値を記述することです。これは、再帰方程式と呼ばれます。
プログラムを作成します。フィボナッチ数列の最初の30項目を出力し、1行あたり5項目を必要とします。
#include <stdio.h> // C语言版本
int fib(int n){
// 根据递归式写出函数
if (n==1 || n==2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main(){
for(int i=1;i<=30;i++) // 输出前30项
{
printf("%-10d",fib(i));
if (i%5==0) // 每行输出5项
printf("\n");
}
}
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
10946 17711 28657 46368 75025
121393 196418 317811 514229 832040
4!再帰
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int factorial(int n){
if(n==0)
return 1;
return n*factorial(n-1);
}
void main(){
factorial(4);
}
文字列の逆再帰もあります!
def reverse_string(string s):
if len(s) == 1:
return s
else:
return s[-1] + reverse_string(s[:-1]);
reverse_string('abc'); //调用函数