递归

定义:一个函数自己直接或间接调用自己
满足递归的三个条件:
  1. 递归必须得有一个明确的终止条件
  2. 该递归所处理的数据规模必须在递减
  3. 这个转化必须是可解的

循环和递归

递归:易于理解;速度慢;存储空间大
循环:不易理解;速度快;存储空间小
举例

求阶乘

1到100求和

汉诺塔

伪算法:
If(n>1)
{
    先将A柱子上的前n-1个盘子从A借助C移到B
    将A柱子上的第n个盘子直接移到C
    再将B柱子上n-1个盘子借助A移到C

}

走迷宫

递归的应用:

    树和森林就是以递归的方式定义的
    树和图的很多算法都是以递归来实现的
    很多数学方式就是以递归的方式定义的
        斐波那契数列:1  2  3  5  8  13  21  34

汉诺塔实现代码:

#include <stdio.h>

void hannuota(int n,char A,char B,char C)
{
    /*
    如果是1个盘子
        直接将A柱子上的盘子从A移到C
    否则
        先将A柱子上的前n-1个盘子从A借助C移到B
        将A柱子上的第n个盘子直接移到C
        再将B柱子上n-1个盘子借助A移到C
    */
    if(1 == n)
    {
        printf("将编号为:%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
    }
    else
    {
        hannuota(n-1,A,C,B);
        printf("将编号为:%d的盘子从%c柱子移到%c柱子\n",n,A,C);
        hannuota(n-1,B,A,C);
    }
}

int main(void)
{
    char ch1='A';
    char ch2='B';
    char ch3='C';
    int n;

    printf("请输入盘子的个数:");
    scanf("%d",&n);

    hannuota(n,'A','B','C');

    return 0;
}