算法与数据结构之递归算法

1.递归算法的核心思想:

将问题转化为同类问题的子问题进行求解。算法

2.递归算法的应用:

  • 汉诺塔

3.问题分析:

1.汉诺塔问题: 函数

clipboard.png
描述:64个盘子从a移到c,要求一次只能移动一个盘子,而且小盘子在上,大盘子在下。spa

编写功能函数:

void hanoi(int n,char a,char b,char c)
  • 含义:
    n:盘子数量。
    a,b,c:三个轴。
  • 思路:
    n=1时,只须要将盘子从a移动到C便可。记做:a->c。
    n>1时,进行以下思考:翻译

技巧:code

咱们知道装大象的步骤以下:

1.打开冰箱
2.装大象
3.关冰箱门 递归

观察以下图: 游戏

图片描述

接下来,咱们将要打开冰箱
图片描述图片

咱们发现当n=2时,汉诺塔游戏能够抽象成一个装大象的过程,过程及其简单易懂。
事实上,不管n为多少,咱们均可以吧汉诺塔抽象成两个来看,也就是将两个当作一个总体!
图片描述ip

而那两个模块(冰箱)咱们又能够把它当作一次大象装冰箱的过程,也就是说3个盘子模块会实现2次装大象的过程。
随着盘子数量愈来愈多,装大象的过程愈来愈多,咱们能够利用函数调用自身函数达到重复循环装的做用,固然你也能够选择for循环,咱们这里讨论递归思想。it


语句等价翻译

hanoi(n-1,a,c,b);//该语句表明打开冰箱!  
a->c;//该语句表明装大象!  
hanoi(n-1,b,a,c);//该语句表明关冰箱门!

具体分析:
hanoi(n-1,a,c,b):表示将冰箱从a这个地方绕过c轴到达b轴这个地方。其中n-1表明冰箱!
a->c:表示将a轴上的最后一个模块盘子(最大的,最底部的大象)直接送到c轴上去!
hanoi(n-1,b,a,c):表示将b轴上的的冰箱绕过a关到c轴上!

以上分析表示了装大象的过程,也是汉诺塔游戏的过程。

4.hanoi函数的具体实现:

void hanoi(int n, char a,char b,char c)//定义hanoi函数
{
    if(n==1)
    printf("%c->%c",a,c);//若是只有一个盘子,也就是说只有大象没有冰箱门的时候,直接把大象装进冰箱里
    else
    {
        hanoi(n-1,a,c,b);//打开冰箱
        printf("%c->%c",a,c);//装大象
        hanoi(n-1,b,a,c);//关冰箱门
    }
}

5.主函数的实现:

#include<stdio.h>
int main()
{
    int n;
    printf("请输入盘子个数:\n);
    scanf("%d",&n);
    hanoi(n,a,b,c);//调用函数
    return 0;
}

6.代码实现:

图片描述

相关文章
相关标签/搜索