服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java与C++分别用递归实现汉诺塔详解

Java与C++分别用递归实现汉诺塔详解

2022-12-16 16:54Demo龙 Java教程

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。本文将用Java与C++分别实现,感兴趣的可以学习一下

1.汉诺塔介绍

Java与C++分别用递归实现汉诺塔详解

汉诺塔规则

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.解塔步骤

Java与C++分别用递归实现汉诺塔详解

圆盘: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为辅助塔
	}
} 

Java与C++分别用递归实现汉诺塔详解

 

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);//规律递归
  }
}

Java与C++分别用递归实现汉诺塔详解

(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为辅助塔
      }
  }
}

Java与C++分别用递归实现汉诺塔详解

到此这篇关于Java与C++分别用递归实现汉诺塔详解的文章就介绍到这了,更多相关Java汉诺塔内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://zal321.blog.csdn.net/article/details/124134208

延伸 · 阅读

精彩推荐
  • Java教程详解springboot shiro jwt实现权限管理

    详解springboot shiro jwt实现权限管理

    为什么使用jwt呢,因为可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快。本篇通过具体代码来进行详情解析,对大家的学习或工...

    CingSuan9872022-01-06
  • Java教程Java实现九宫格的简单实例

    Java实现九宫格的简单实例

    这篇文章主要介绍了 Java实现九宫格的简单实例的相关资料,需要的朋友可以参考下...

    ieearth7362020-11-12
  • Java教程Java使用Socket通信传输文件的方法示例

    Java使用Socket通信传输文件的方法示例

    这篇文章主要介绍了Java使用Socket通信传输文件的方法,结合实例形式分析了java socket编程实现文件传输操作的相关技巧,需要的朋友可以参考下...

    kongxx4822020-11-23
  • Java教程Java的枚举类型使用方法详解

    Java的枚举类型使用方法详解

    这篇文章主要介绍了Java的枚举类型使用方法详解,从背景、到定义、特点、使用方式做个简单了解,感兴趣的小伙伴们可以参考一下 ...

    奋斗在路上3902020-03-23
  • Java教程Mybatis批量修改的操作代码

    Mybatis批量修改的操作代码

    这篇文章主要介绍了Mybatis批量修改的操作代码,需要的朋友可以参考下...

    陌上胥黎4882021-01-12
  • Java教程浅析spring定时器的使用

    浅析spring定时器的使用

    这篇文章主要介绍了浅析spring定时器的使用,帮助大家更好的理解和学习spring框架,感兴趣的朋友可以了解下...

    cing_self4902020-10-05
  • Java教程JavaWeb连接数据库MySQL的操作技巧

    JavaWeb连接数据库MySQL的操作技巧

    数据库是编程中重要的一部分,它囊括了数据操作,数据持久化等各方面。在每一门编程语言中都占有相当大的比例。本次,小编以MySQL为例,使用mvc编程...

    JokerLoveAllen2992020-08-04
  • Java教程java反射超详细讲解

    java反射超详细讲解

    本文非常详细的讲解了java反射具体的内容以及使用,java反射在现今的使用中很频繁,希望此文可以帮大家解答疑惑,可以帮助大家理解...

    LL.LEBRON8672021-11-25