Java与C++分别用递归实现汉诺塔详解
作者:Demo龙 发布时间:2021-10-23 01:28:59
标签:Java,汉诺塔,C++
1.汉诺塔介绍
汉诺塔规则
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
2.解塔步骤
圆盘:12345 柱子:ABC
1→C,2→B,1→B,3→C,1→A,2→C,1→C,4→B; 1→B,2→A,1→A,3→B,1→C,2→B,1→B,5→C; 1→A,2→C,1→C,4→A,1→B,2→A,1→A,4→C; 1→C,2→B,1→B,3→C,1→A,2→C,1→C,完成!
3.C++实现(递归结果及显示步骤)
(1)递归结果
#include<iostream>
using namespace std;
int H_tower(int num);
int main()
{
int num;
cout<<"请输入需要移动的盘子数"<<endl;
cin>>num;
cout<<H_tower(num)<<endl;
}
int H_tower(int num)
{
if(num<1)
{
cout<<"请输入大于等于一的数"<<endl;
exit(-1); //输入不合法,退出程序
}
if(num==1)
{
return 1;
}
return (2*H_tower(num-1)+1);//规律递归
}
(2)显示步骤
#include<iostream>
using namespace std;
void hannuo(int num);
void Move(int &sum,int num,char A,char B,char C);
int main()
{
int num;
cout<<"请输入需要移动的盘子数"<<endl;
cin>>num;
hannuo(3);
}
void hannuo(int num)
{
if(num<1)
{
cout<<"请输入大于等于一的数"<<endl;
exit(-1); //输入不合法,退出程序
}
int sum=0;
Move(sum,num,'A','B','C');
}
void Move(int &sum,int num,char A,char B,char C)
{
if(num==1)
{
sum++;
//圆盘只有一个时,只需将其从A塔移到C塔
cout << "第 "<<sum<<" 次move " << num << " from " << A << " to " << C << endl;
}
else
{
Move(sum,num - 1, A, C, B);//递归,把A塔上编号1~n-1的圆盘移到B上,以C为辅助塔
sum++;
cout << "第 "<<sum<<" 次move " << num << " from " << A << " to " << C << endl;//把A塔上编号为n的圆盘移到C上
Move(sum,num - 1, B, A, C);//递归,把B塔上编号1~n-1的圆盘移到C上,以A为辅助塔
}
}
4.Java实现(递归结果及显示步骤)
(1)递归结果
hannuo.java
import java.util.Scanner;
public class hannuo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num;
System.out.println("请输入需要移动的盘子数");
num= sc.nextInt();
tower t=new tower();
System.out.println("需要移动的次数 = "+t.H_tower(num));
}
}
tower.java
public class tower {
public int H_tower(int num) {
if (num < 1) {
System.out.println("请输入大于等于一的数" );
}
if (num == 1) {
return 1;
}
return (2 * H_tower(num - 1) + 1);//规律递归
}
}
(2)显示步骤
hannuo.java
import java.util.Scanner;
public class hannuo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num;
System.out.println("请输入需要移动的盘子数");
num= sc.nextInt();
tower t=new tower();
t.hannuo(num);
}
}
tower.java
public class tower {
public void hannuo(int num)
{
if(num<1)
{
System.out.println("请输入大于等于一的数");
}
int sum[]={0};
Move(num,'A','B','C');
}
public void Move(int num,char A,char B,char C)
{
if(num==1)
{
//圆盘只有一个时,只需将其从A塔移到C塔
System.out.println(" move " + num + " from " + A + " to " + C );
}
else
{
Move(num - 1, A, C, B);//递归,把A塔上编号1~n-1的圆盘移到B上,以C为辅助塔
System.out.println(" move " + num + " from " + A + " to " + C );//把A塔上编号为n的圆盘移到C上
Move(num - 1, B, A, C);//递归,把B塔上编号1~n-1的圆盘移到C上,以A为辅助塔
}
}
}
来源:https://zal321.blog.csdn.net/article/details/124134208


猜你喜欢
- 1. 前言现在很多应用都有小悬浮窗的功能,比如看直播的时候,通过Home键返回桌面,直播的小窗口仍可以在屏幕上显示。下面将介绍下悬浮窗的的一
- 一. 泛型概念的提出(为什么需要泛型)?首先,我们看下下面这段简短的代码:public class GenericTest {public
- 方法1:以textbox为例①:先设置textbox的属性Multiline为true②:组织好显示字符串:FistLine(第一行要显示的
- AIDL:Android Interface Definition Language,它是一种android内部进程通信接口的描述语言,通过
- 主要完成任务:1.read read 并行化2.read write 不允许3.write write 不允许public class Re
- 1、三元运算符:class Program {  
- 前言什么是mybatis二级缓存?二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace。即,在不同的s
- Java Hibernate对象
- 当我们使用swagger,进行接口测试,怕接口不安全,担心暴露。可采用两种方式1.环境权限配置对swagger文档配置只在测试环境可访问,生
- 本文实例讲述了Android实现SQLite添加、更新及删除行的方法。分享给大家供大家参考,具体如下:SQLiteDatabase类暴露了特
- 题目给定count=0;让5个线程并发累加到1000;思路创建一个类MyRunnable,实现Runnable(继承Thread类也可)定义
- 问题描述:使用Design包的TabLayout实现类似网易选项卡动态滑动效果的时候,使用addTab()方法给TabLayout动态添加标
- Mybatis简介MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software
- 认识数组数组的定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元
- 介绍Dubbo 是一款高性能、轻量级的 Java RPC 框架,由阿里巴巴开源并贡献至 Apache 基金会。它能够提供服务的注册与发现、负
- 在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有
- 本文实例讲述了WinForm实现仿视频播放器左下角滚动新闻效果的方法。分享给大家供大家参考。具体实现方法如下:using System;us
- 如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・
- 本方式可以获得内部存储设备地址、SD卡地址、USB设备地址,兼容性能达到99%(别问我为什么这么保证,因为是借鉴了Android设置->
- Java 多文件加密压缩 添加文件加密压缩工具包依赖<!-- zip4j压缩工具 --> <dependenc