今天来说一说经典的算法问题换诺塔问题,这个问题比较容易理解,但是数比较大的时候机器计算花费的时间很长。
汉诺塔问题的解释,这里就不详细说了,给大家附上百度百科的链接大家了解一下。
以下是该程序的代码:
/*
* Hanoi.java
*
* Created on: 2020年2月22日
* Author: Sdjzu_Nxy
*/
package algorithm;
import java.util.Scanner;
public class Hanoi {
static int i = 0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入圆盘的数量:");
int number = input.nextInt();
// System.out.printf("需要移动的次数:%f",hanoiMethod2(number));
System.out.println("移动过程如下:");
hanoiMethod1(number,"A","B","C");
System.out.printf("需要移动的次数:%d",i);
}
public static void hanoiMethod1(int number,String aNow,String bPass,String cDest) {
if (number == 1) {
i++;
System.out.println(aNow+"--->"+cDest);
}
else {
hanoiMethod1(number - 1, aNow,cDest,bPass);
hanoiMethod1(1, aNow,bPass,cDest);
hanoiMethod1(number - 1,bPass,aNow, cDest);
}
}
// public static double hanoiMethod2(int number) {
// double sum = Math.pow(2.0, (double)number);
// return sum - 1.0;
// }
}
算法分析:这里直接试一下程序函数部分吧,
public static void hanoiMethod1(int number,String aNow,String bPass,String cDest) {
if (number == 1) {
i++;
System.out.println(aNow+"--->"+cDest);
}
else {
hanoiMethod1(number - 1, aNow,cDest,bPass);
hanoiMethod1(1, aNow,bPass,cDest);
hanoiMethod1(number - 1,bPass,aNow, cDest);
}
}
算法分析:先来解释其中函数的四个参数,number指的是圆盘的数目,aNow指的是目前圆盘所在的那个柱子,bPass指的是经过哪个柱子,cDest指的是最终移到哪根柱子;接下来就是采用递归的方式,为了便于解释,我们假设有3个圆盘,接下来我用图示说明:
算法可能不是很好理解,我也是通过简单的3个圆盘的例子,debug慢慢看的,Java的的经典算法,通过强哥的课程看了这么多,目前先告一段落了,如果以后再遇到算法的题目,我还会继续记录下来!