博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汉诺塔递归问题
阅读量:6865 次
发布时间:2019-06-26

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

hot3.png

1.一个函数对于其它函数来说相当于一个盒子,他封装了其中的内容,其它函数只知道给它参数,然后得到它的结果。就好比一个的商店:我们只需要知道给钱,它就会给蛋糕。而我们不需要理解他们是怎么做出来的这个蛋糕。

2.调用的过程,就相当于上面例子中我们去买蛋糕的过程。谁说自己不能买自己店里的蛋糕呢?比如你是做蛋糕的,难道你不能买自己店里的蛋糕吗?函数的自我调用(?)也是这么回事情。

对于hanoi类里面,两个核心函数:

move(char getme, char purone):

这个函数的功能是:把getme最上面的盘子移动到purone位置,比如 move('A','B')就是把A柱子最上面那个盘子移动到B柱子的最上面。

hanoi(int n,char one,char two,char three):

这个函数的功能是:现在在柱子one上一共有n个盘子,这个函数能够通过two把它移动到three上面。 现在你了解了这两个函数设计的初衷,ok,我们来分别实现每个函数。

public void move(char getme,char purone) {

//请联系上面写的这个函数的功能来看: c=c+1;//我们每移动一步,就计数一次

System.out.println(getme+"-->"+putone+"搬盘次数为:"+c); //这行使用输出来表明移动过了(事实上hanoi就是要让你详细说明移动过程,所谓“说明”,就是打印出每次的移动,那这里我们就把这次移动打印出来,这个没有任何问题吧?这个函数就是要把移动这件事情说出来,明白?

}

public void hanoi(int n,char one,char two,char three) {

//请回忆hanoi函数的功能,是要把one柱子上的前n个放到three柱子上:

if(n==1) //如果n==1,那也就是要把one柱子上最上面的那个移到three上面了,这就是move函数的作用,对吧?那就直接调用

move(one,three) move(one,three);

else{ //如果n>1的话,那? 分为三个步骤:

1.先想办法把one主子上的前n-1个移动到柱子two上

2.然后把one柱子上的第n个移动到柱子three上。

3.然后想办法把two柱子上的n-1个移动到three上。

对吧?现在你注意到第1步和第3步是不是就是hanoi这个函数的功能能够实现的呢?回答显然是肯定的,下面就是这三步。

hanoi(n-1,one,three,two); //把one柱子上的n-1个通过three移动到two上。

move(one,three); //把one主子上最上面那个(注意,上面一步已经把前n-1个移动到two上面了,one柱现在最上的那个就是第N个)

hanoi(n-1,two,one,three);//把two柱子上的n-1个移动到three柱子上。

}

} 解释到这里,里面的调用应该也就很明白了吧?

a.hanoi(m,'A','B','C'); 把'A'柱子上的m个盘子通过'B'柱子全部移动到'C'上面的步骤。 解释起来很容易,想得多了也就慢慢明白了,最难的是如何设计一个递归出来。这个和数学里面的很相似(事实上其来源就是递推公式),想必你肯定知道递增函数把?

An = An-1 + 5(A0 = 0 );这个条件能够唯一确定一个数列。 那现在你把它写成函数呢?

int A(int n) {

    if(n == 0) {

        return 0;

    } else {

        return A(n -1) + 5;

    }

}

转载于:https://my.oschina.net/u/2900652/blog/789599

你可能感兴趣的文章
ubuntu 下配置 eclipse + java + adt 开发环境
查看>>
庞岩老师的感想day0926
查看>>
java的流控制学习笔记
查看>>
linux下echo命令详解
查看>>
colorful i106q装安卓系统
查看>>
ASP.NET 使用js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)
查看>>
我的友情链接
查看>>
CentOS 7升级内核
查看>>
下载上传文件命令rz和sz
查看>>
Mysql安装:/bin/rm: cannot remove `libtoolt': No such file or directory
查看>>
夜已深,为何身体没有困意!
查看>>
孙子兵法
查看>>
MAC使用技巧之苹果电脑新手最容易犯的20个错误
查看>>
vm虚拟机安装系统后出现operating system not found解决办法(VM装ghost 不能进系统的解决方法)...
查看>>
二进制安装 MySQL 格式待整理
查看>>
按时按登录IP记录Linux所有用户操作日志的方法(附脚本)
查看>>
JAVA中的标记接口
查看>>
ERP英文常见缩写
查看>>
优秀博文汇总
查看>>
MapReduce Application中mapper的数目和分片的数目
查看>>