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

 更新时间:2022年05月19日 09:31:59   作者:Demo龙  
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。本文将用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为辅助塔
        }
    }
}

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

相关文章

  • 基于Java编写一个限流工具类RateLimiter

    基于Java编写一个限流工具类RateLimiter

    这篇文章主要为大家详细介绍了如何基于Java编写一个限流工具类RateLimiter,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Java实现转跳不同系统使用枚举加switch的方式示例

    Java实现转跳不同系统使用枚举加switch的方式示例

    今天小编就为大家分享一篇关于Java实现转跳不同系统使用枚举加switch的方式示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • java中排序报:Comparison method violates its general contract异常的解决

    java中排序报:Comparison method violates its general contract异常的解

    这篇文章主要给大家介绍了关于java中排序报:Comparison method violates its general contract异常的解决方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • 使用jdbcTemplate查询返回自定义对象集合代码示例

    使用jdbcTemplate查询返回自定义对象集合代码示例

    这篇文章主要介绍了使用jdbcTemplate查询返回自定义对象集合代码示例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java 方法(方法的定义,可变参数,参数的传递问题,方法重载,方法签名)

    Java 方法(方法的定义,可变参数,参数的传递问题,方法重载,方法签名)

    这篇文章主要介绍了Java 方法(方法的定义,可变参数,参数的传递问题,方法重载,方法签名),文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • Java Arrays.sort()用法详解

    Java Arrays.sort()用法详解

    这篇文章主要介绍了Java Arrays.sort()用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java中闭包简单代码示例

    Java中闭包简单代码示例

    这篇文章主要介绍了Java中闭包简单代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • SpringBoot实现文件上传下载功能小结

    SpringBoot实现文件上传下载功能小结

    最近做的一个项目涉及到文件上传与下载功能。SpringBoot后台如何实现文件上传下载呢?下面有单文件上传和多文件上传功能,感兴趣的朋友一起看看吧
    2017-08-08
  • Java基础之位运算知识总结

    Java基础之位运算知识总结

    最近接触到了java位运算,之前对位运算的了解仅仅停留在表现结果上,乘2除以2,对背后的原理并不了解,现在学习记录一下,需要的朋友可以参考下
    2021-05-05
  • SpringBoot实现RabbitMQ三种使用方式

    SpringBoot实现RabbitMQ三种使用方式

    本文主要介绍了SpringBoot实现RabbitMQ三种使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论