数据结构:递归

 

1.定义

  一个函数直接或间接的调用自己

 2.举例

  1)求阶乘

  2)1+2+3+4+……+10

  3)汉诺塔

  4)走迷宫

(1)(2)求阶乘,求累加

 a.循环解决

int main()
{
    int val;
    int i, mult = 1;
    printf("请输入一个数字:");
    printf("val = ");
    scanf("%d", &val);
    for (i=1; i<=val; i++)
    {
        mult = mult * i;
    }
    printf("%d的阶乘是%d",val, mult);
    return 0;
}

   b.递归解决

//假定n的值是1或者大于1的值
long f(long n)
{
    if (1 == n)
    {
        return 1;
    }
    else
    {
        return f(n-1) * n;  //如果求的是累加 则return f(n-1) + n
    }
}


int main()
{
    int n;
    printf("请输入一个数字:");
    printf("n = ");
    scanf("%d", &n);

    printf("%d的阶乘是%d",n, f(n));
    return 0;
}

(3)汉诺塔

   伪算法

    先把A柱子上的前n-1个盘子从A借助C移到B

    将A柱子上的第n个盘子直接移到C

    再将B柱子上的n-1个盘子借助A移到C

 代码实现
void hanoi(int n, char A, char B, char C)
{
    /*

 次数为2的n次方减1次
    如果是一个盘子
        直接将A柱子上的盘子移动到C柱子上
    否者
        先将A柱子上的n-1个盘子借助C移动到B柱子
            A       B      C
            n-1 ->      ->n-1
                     n-1  <-n-1
            n-1->  n-1

        再将A柱子上的盘子从A移到C
            A         C

        结果第n个  -> 第n个
        最后将B柱子上的n-1个盘子借助A移到C
            A      B      C
            n-1  <-n-1
            n-1           ->n-1
               n-1    ->n-1
    */
    if (1 == n)
    {
        printf("将编号为%d的盘子直接从%c柱子移动到%c柱子\n",n, A, C);
    }
    else
    {
        hanoi(n-1, A, C, B);
        printf("将编号为%d的盘子直接从%c柱子移动到%c柱子\n",n, A, C);
        hanoi(n-1, B, A, C);
    }
}

int main()
{

    int n;

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

    hanoi(n, 'A', 'B', 'C');
    return 0;
}

3.原理

 

  

 

  间接调用

    f()调用g(),g()调用k()

  自己调用

    f(n)调用f(n-1),f(n-1)调用f(n-2),一直到无法调用为止

4.循环和递归区别

  递归

    易于理解

    速度慢

    存储空间大

  循环

    不易理解

    速度快

    存储空间小

posted on 2019-05-30 14:11  zhaoy_shine  阅读(140)  评论(0编辑  收藏  举报

导航