每日一练蓝桥杯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),代入条件判断是否符合。

扫描二维码关注公众号,回复: 13742442 查看本文章
#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次
} 
蓝桥杯 我要获奖!
蓝桥杯 我要获奖!
蓝桥杯 我要获奖!

通过这两个例子是不是更好理解函数嵌套调用与递归,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
欢迎来到蓝桥杯

有个小技巧:遇到递归用条件语句!

递归的产生

由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技 术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与 原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直 接求出其解。这自然导致递归过程的产生。

递归的应用

  • 问题的定义是递归的,如阶乘问题。

  • 问题的求解过程是递归的,如汉诺塔问题。

  • 问题采用的数据结构是递归的,如链表中搜索链表中的元素。

递归的数学公式

  • 它是一组等式或不等式;

  • 它的第一式给出了函数初始值,称为边界条件;

  • 边界条件和递归方程是递归的两个基本要素。

  • 它的第二式是用较小自变量的函数值来描述较大自变量的函数值, 称为递归方程;

编写程序:输出斐波那契数列的前30项,要求每行输出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