基础算法 —— 递归算法

【概述】

  1. 递归算法:一种通过重复将问题分解为同类的子问题而解决问题的方法。
  2. 适用问题:解决结构自相似的问题。即:构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。
  3. 特点:反复执行、结束反复执行的条件
  4. 缺点:占用大量内存且不易阅读

【两个问题】

  1. 递归边界条件(递归终止条件):确定递归到何时终止,或者说,直接有解的情况。
  2. 递归模式(递归体):大问题是如何分解为小问题的。 

注:递归终止条件通常就是得出最小问题的解,并返回给他的调用者。

【间接递归与直接递归】

    1.直接递归调用:就是在函数f中直接调用函数f本身

《基础算法 —— 递归算法》

    2.间接递归调用:就是在函数f1中调用另外一个函数f2,而该函数f2又调用了函数f1

《基础算法 —— 递归算法》

【经典应用】

1.递归求和

void Sum(int n)
{
    if(n>1)
        return n+Sum(n-1);
    else
        return 1;
}

2.递归求阶乘

阶乘的递归公式:

《基础算法 —— 递归算法》

int F(int n)  
{  
    if(n==0)
        return 1;  
    return n*F(n-1);
}

3.斐波那契数列递归实现

int Fibonacci(int n)
{
    if(n==1)
        return 1;
    if(n==2)
        return 1;
    return Fibonacci(n-1)+Fibonacci(n-2);
}

关于斐波那契数列:点击这里

4.汉诺塔问题的递归实现

 #include<stdio.h>
void move(int n, char x, char y, char z)//将n个圆盘从x柱子上借助y柱子移动到z柱子上
{
     if(n == 1)
     	printf("圆盘编号 %d :从 %c 移动到 %c\n",n,x,z);
     else
     {
         move(n-1,x,y,z);
         printf("圆盘编号 %d:从 %c 移动到 %c\n",n,x,z);
         move(n-1,y,x,z);
      }
 }
int main()
{
    int n;//n代表圆盘的个数
    /*A,B,C分别代表三个柱子*/
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';
 
     printf("请输入圆盘的个数:");
     scanf("%d",&n);
     move(n,ch1,ch2,ch3);
     return 0;
}

关于汉诺塔问题:点击这里

【例题】

1.普通

  1. 数的计算(洛谷-P1028):点击这里
    同题:数的计数(信息学奥赛一本通-T1316):点击这里
  2. 放苹果(信息学奥赛一本通-T1206):点击这里
  3. 鸣人的影分身(信息学奥赛一本通-T1303):点击这里
  4. 进制转换(洛谷-P1017):点击这里
  5. Pell数列(信息学奥赛一本通-T1202):点击这里
  6. 黑白棋子的移动(信息学奥赛一本通-T1327):点击这里
  7. 判断元素是否存在(信息学奥赛一本通-T1211):点击这里
  8. 汉诺塔问题(信息学奥赛一本通-T1205):点击这里
  9. 分解因数(信息学奥赛一本通-T1200):点击这里
  10. 因子分解(信息学奥赛一本通-T1210):点击这里
  11. 分数求和(信息学奥赛一本通-T1209):点击这里
  12. 求最大公约数问题(信息学奥赛一本通-T1207):点击这里

2.其他

  1. 火柴棒等式(洛谷-P1149)(打表递归)点击这里
  2. 逆波兰表达式(信息学奥赛一本通-T1198)(atof()函数的使用)点击这里
  3. 选数(洛谷-P1036)(递归+素数判断)点击这里
  4. 幂次方(洛谷-P1010)(递归+整数分解)点击这里
    同题:2的幂次方表示(信息学奥赛一本通-T1208):点击这里
    原文作者:递归算法
    原文地址: https://blog.csdn.net/u011815404/article/details/80115110
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞