每日一练蓝桥杯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'); //调用函数



相关文章
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
2月前
|
人工智能 算法 BI
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
|
2月前
|
人工智能 C++
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
80 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
2月前
|
机器学习/深度学习 算法 关系型数据库
第十五届蓝桥杯C++B组省赛
第十五届蓝桥杯C++B组省赛
101 14
|
2月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
50 5
|
3月前
|
存储 算法 安全
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
111 1
|
2月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
27 0
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
2月前
|
算法 Java 编译器
【递归算法】斐波那契变形问题(C/C++)
【递归算法】斐波那契变形问题(C/C++)