毎日の練習BlueBridgeCup C / C ++グループB〜再帰的アルゴリズムとは何ですか?

再帰とは何ですか?

再帰とは、関数がそれ自体を呼び出すときです。

いわゆる再帰とは、再帰して戻ることです。再帰のみがプログラムのクラッシュを引き起こします!

必要に応じて再帰を終了するには(クラッシュを回避するために、再帰関数には条件ステートメントが含まれている必要があります)

例:

#定义一个递归函数
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'); //调用函数

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/A6_107/article/details/123274240