博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法与数据结构之递归算法
阅读量:6705 次
发布时间:2019-06-25

本文共 1138 字,大约阅读时间需要 3 分钟。

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

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

2.递归算法的应用:

  • 汉诺塔

3.问题分析:

1.汉诺塔问题:

clipboard.png

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

编写功能函数:

void hanoi(int n,char a,char b,char c)
  • 含义:
    n:盘子数量。
    a,b,c:三个轴。
  • 思路:

    n=1时,只需要将盘子从a移动到C即可。记作:a->c。
    n>1时,进行如下思考:

技巧:

我们知道装大象的步骤如下:

1.打开冰箱

2.装大象
3.关冰箱门

观察如下图:

图片描述

接下来,我们将要打开冰箱

图片描述

我们发现当n=2时,汉诺塔游戏可以抽象成一个装大象的过程,过程及其简单易懂。

事实上,无论n为多少,我们都可以吧汉诺塔抽象成两个来看,也就是将两个看成一个整体!
图片描述

而那两个模块(冰箱)我们又可以把它看成一次大象装冰箱的过程,也就是说3个盘子模块会实现2次装大象的过程。

随着盘子数量越来越多,装大象的过程越来越多,我们可以利用函数调用自身函数达到重复循环装的作用,当然你也可以选择for循环,我们这里讨论递归思想。


语句等价翻译

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
int main(){ int n; printf("请输入盘子个数:\n); scanf("%d",&n); hanoi(n,a,b,c);//调用函数 return 0;}

6.代码实现:

图片描述

转载地址:http://gfblo.baihongyu.com/

你可能感兴趣的文章
win7 64位下android开发环境的搭建
查看>>
MAC下《暗黑世界》客户端版本编译说明!!
查看>>
去除字符串中连续重复的字符
查看>>
poj3621 Sightseeing Cows --- 01分数规划
查看>>
适配器模式
查看>>
Java的递归算法
查看>>
stm32之watchdog
查看>>
500 TypeError: Cannot read property 'connect.sid' of undefined
查看>>
【python】入门学习(八)
查看>>
实现微信浏览器内打开App Store链接
查看>>
动态内存分配输入整数并对其排序输出
查看>>
CentOS 下安装MySQL 默认源为5.1版本
查看>>
jQuery 特效:盒子破碎和移动动画效果
查看>>
cocos2d-x-3.1 事件分发机制 (coco2d-x 学习笔记七)
查看>>
c++ THUNK技术
查看>>
linux dd实现磁盘完整全盘镜像备份backup,恢复recover(restore)
查看>>
Cocos2d-X中的ProgressTimer
查看>>
HDU 1757 A Simple Math Problem(矩阵高速幂)
查看>>
Lua 之面向对象编程
查看>>
胎压监测设备
查看>>