每日一练蓝桥杯C/C++B组~什么是递归算法?

简介: 每日一练蓝桥杯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次
} 
蓝桥杯 我要获奖!
蓝桥杯 我要获奖!
蓝桥杯 我要获奖!

通过这两个例子是不是更好理解函数嵌套调用与递归,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'); //调用函数



相关文章
|
7天前
|
机器学习/深度学习 安全 算法
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
|
7天前
|
人工智能 算法 测试技术
【数学】【排序】【C++算法】3027人员站位的方案数
【数学】【排序】【C++算法】3027人员站位的方案数
|
6天前
|
测试技术
消除游戏(第十三届蓝桥杯省赛C++C组 , 第十三届蓝桥杯省赛PythonA/B/研究生组)
消除游戏(第十三届蓝桥杯省赛C++C组 , 第十三届蓝桥杯省赛PythonA/B/研究生组)
消除游戏(第十三届蓝桥杯省赛C++C组 , 第十三届蓝桥杯省赛PythonA/B/研究生组)
|
6天前
|
人工智能 BI 测试技术
三国游戏(第十四届蓝桥杯省赛C++C组)
三国游戏(第十四届蓝桥杯省赛C++C组)
|
7天前
|
算法 安全 定位技术
【刷题】备战蓝桥杯 — dfs 算法
dfs算法在数据较小的情况下可以使用。 一定一定要确定好终止条件,避免栈溢出。 相应做好回溯,保证每次的遍历都是不一样的选择,避免少结果。 针对题目进行对应细节处理,有能力的话可以进行剪枝优化!!!
14 0
|
7天前
|
存储 缓存 算法
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
|
7天前
|
存储 算法 程序员
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
|
7天前
|
测试技术 C++
[蓝桥杯 2023 省 B] 冶炼金属(c++)
[蓝桥杯 2023 省 B] 冶炼金属(c++)
28 0
|
7天前
|
人工智能 算法 BI
【图论】【 割边】【C++算法】1192. 查找集群内的关键连接
【图论】【 割边】【C++算法】1192. 查找集群内的关键连接
|
7天前
|
算法 测试技术 C#
【模拟】【C++算法】2826. 将三个组排序
【模拟】【C++算法】2826. 将三个组排序