`
xiangpin
  • 浏览: 9454 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

C#及Java递归方法实现Hanoi塔(汉诺塔)问题

阅读更多

今天,在学习C#的时候,遇到了一个很有意思很经典的问题--Hanoi塔(汉诺塔)问题。于是就研究了一下子,现在小小的总结一下。

(1)问题的描述

古代有一个梵塔,塔内有3个座,分别用A、B、C表示。开始时A座有N个盘子,盘子两两大小不等,大的在下,小的在上,盘子编号从上到下分别编号为1到N。B座,C座上面没有盘子。要求将这N个盘子从A移到C上,且在移动的过程中大盘不能压在小盘上。移动过程可以借助B盘中转。

(2)问题的分析

这是一个典型的递归问题,将A转移到C,可以分为下面的这些步骤:

1.如果N=1,那么只需要将盘子从A移到C即可。所以,N=1也是递归终止条件。

2.如果N>1,那么将N-1个盘子从A移到B,利用C做中转。再将第N个盘子从A移到C。

3.接下来,就变成了一个N-1个盘子从B移到C的,A为中转的汉诺塔问题了,就可以直接递归了。

(3)问题的实现

那么,在实现的时候,我用了以前学习的Java和最近正在学习的C#语言来实现它,其实两种语言差不多,在实现这个问题的具体算法上,没有很大的不同。

1.C#版本实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hanoi
{
    class Program
    {
        //总共搬动盘子的次数
        static int count = 0;
       
        /*
         *程序入口 
         */
        static void Main(string[] args)
        {
            Console.Write("请输入Hanoi塔问题的盘子数目:");
            int n = int.Parse(Console.ReadLine());
            Hanoi(n,'A','B','C');
            Console.WriteLine("移动结束,一共进行了{0}次移动",count);
            Console.ReadLine();
        }


        /*
        *输出一个移动步骤的方法 
        */
        public static void PrintMove(char x, char y)
        {
            Console.WriteLine("{0}-->{1}", x, y);
        } 

        /*
         Hanoi塔递归方法,n是盘子数,one,two,three是3个座
         */
        public static void Hanoi(int n,char one,char two,char three) {

            if (n == 1)
            {
                ++count;
                PrintMove(one, three);
                return;
            }
            else {
                ++count;
                //把N-1个盘子拿到中转座
                Hanoi(n-1,one,three,two);
                //将第N个盘子移到目标座
                PrintMove(one,three);
                //把中转座上的N-1个盘子移到目标座
                Hanoi(n-1,two,one,three);
            }
        }
    }
}

 运行结果:



 

1.Java版本实现

import java.util.Scanner;

  /**
	 * 汉诺塔问题
	 * xiangpin
	 */
public class Hanoi {
	
	//计算搬动盘数目
	public static int count=0;
	/**
	 * 程序入口
	 * @param args
	 */
	public static void main(String[] args) {

	//从键盘读取数据
		System.out.println("请输入汉诺塔问题的盘子数目:");
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		Hanoi(n,'A','B','C');
		System.out.println("移动结束,一共移动了"+count+"次");
	}
	
	/**
	 * 输出移动步骤的方法
	 */
	public static void PrintMove(char x,char y){
		System.out.println("从"+x+"移动到"+y);
		
	}
	
	/**
	 * 汉诺塔的递归方法,n是盘子数,one,two,three是3个座
	 */
	public static void Hanoi(int n ,char A,char B,char C){
		//如果N=1,则直接从A搬到C
		if(n==1){
			++count;
			PrintMove(A,C);
			
		}
		else{
			++count;
			//如果n>1,则将n-1个盘子,从A搬到B,C作为中转
			Hanoi(n-1,A,C,B);
			//再将第n个盘子搬到C
			PrintMove(A,C);
			//现在问题变成n-1个盘子,从B到C,A为中转的问题了,运用递归
			Hanoi(n-1,B,A,C);	
		}
	}
}

 运行结果:



 通过这个例子可以很容易的看出来,利用递归可以很快速且有效的得出结果。另外,我觉得将一种自己较为熟悉的语言和另外一种新学的结合起来学习,是一件很有趣的事情。

  • 大小: 32.7 KB
  • 大小: 24.9 KB
分享到:
评论

相关推荐

    Hanoi塔问题的一种非递归算法

    ### Hanoi塔问题的一种非递归算法:深入解析与实现 #### 一、引言 Hanoi塔问题作为计算机科学领域内经典的递归问题之一,因其简洁性和挑战性而广受关注。通常,Hanoi塔问题的解决方案多采用递归算法,尽管其逻辑...

    C# 实现汉诺塔问题 递归+Recursion

    本文将详细讲解如何用C#实现汉诺塔问题以及递归的概念。 首先,理解递归是非常关键的。递归是一种算法或函数调用自身的方法,通常用于解决可以分解为相同子问题的问题。在汉诺塔问题中,我们可以通过递归策略来解决...

    递归实现汉诺塔-c#

    通过以上分析,我们可以看到C#如何利用递归解决汉诺塔问题,这展示了递归在解决复杂问题时的强大能力。理解并掌握递归算法对于编程学习至关重要,因为它在许多领域都有广泛应用,如树遍历、图搜索、动态规划等。

    HanNuoTa.zip_C#汉诺塔_csharp 汉诺塔_tower of hanoi_汉诺塔

    汉诺塔(Tower of Hanoi)是一个经典的递归问题,起源于19世纪的法国,由数学家爱德华·卢卡斯提出。这个谜题包含三根柱子和一堆大小不一的圆盘,玩家的目标是将所有圆盘从第一根柱子移动到第三根柱子,每次只能移动...

    hannuota.rar_C# 汉诺塔代码_C#汉诺塔_C#编写汉诺塔_c# 汉诺塔代码_c#汉诺塔问题

    汉诺塔(Hanoi Tower)是一个经典的递归问题,源于19世纪的法国数学家艾德蒙·朗利。在C#中实现汉诺塔问题的解决方案,可以帮助开发者理解和掌握递归算法及其应用。汉诺塔游戏有三个柱子和一堆大小不一的圆盘,目标...

    用c#实现汉诺塔问题

    通过上述分析,我们可以看出,使用 C# 实现汉诺塔问题不仅能够清晰地展示递归思想的应用,而且通过适当的封装,使得代码具有良好的可读性和可维护性。同时,堆栈作为一种高效的数据结构,在处理此类问题时表现出色,...

    C#图形界面汉诺塔Hanoi

    汉诺塔(Hanoi)游戏是一个经典的递归问题,它涉及到三个柱子和一堆不同大小的圆盘。玩家需要将所有圆盘从一个柱子移动到另一个柱子,每次只能移动一个圆盘,并且任何时候大盘子都不能位于小盘子之上。在C#环境下,...

    Hanoi塔的C#图形化实现

    通过这个C#实现的汉诺塔图形化示例,学生不仅可以深入理解递归算法的本质,还能学习到图形界面编程的基本技巧,以及如何利用多线程优化程序性能。这不仅是一个教育工具,也是一个实践和提升编程技能的平台。项目源...

    汉诺(Hanoi)塔演示C#代码

    总结来说,汉诺塔问题展示了递归算法在解决复杂问题中的应用,而C#作为一种功能强大的编程语言,能够很好地实现这种算法,并通过图形化界面进行演示,帮助用户更好地理解和学习递归的思想。通过上述C#代码和适当的...

    C#可视化动态汉诺塔实现

    汉诺塔(Hanoi Tower)是一个经典的递归问题,它源于19世纪法国数学家艾德蒙·朗利所提出的一个益智游戏。在C#中实现汉诺塔的可视化动态展示,可以让用户直观地看到游戏过程。这个项目是基于Visual Studio 2010的,...

    C#汉诺塔代码

    汉诺塔(Hanoi Tower)是一个经典的递归问题,它在计算机科学中常被用作教学示例。在这个C#项目中,我们看到开发者利用C#的WinForms平台创建了一个汉诺塔游戏的图形界面,并引入了线程来增强用户体验。下面我们将...

    [转帖] 用C# Generator解决Hanoi塔问题

    【标题】:“用C# Generator解决Hanoi塔问题”揭示了如何使用C#编程语言来构建一个自动化生成器,以高效地处理经典的汉诺塔问题。汉诺塔问题是一个著名的递归问题,它涉及到将一组盘子从一根柱子移动到另一根柱子,...

    Hanoi塔 可视化程序源码(C#)

    1. `HanoiTower` 类:这是整个程序的核心,包含了汉诺塔问题的解法,以及与用户界面交互的方法。 2. `DiskControl` 类:这个自定义控件代表圆盘,包含绘制圆盘的逻辑和响应鼠标事件的方法。 3. `MainForm` 类:作为...

    递归算法汉诺塔C#编程.7z

    此外,压缩包中的“汉诺塔及阶乘”可能还包括了阶乘的递归实现。阶乘是一个数学概念,表示从1到某个整数n的所有整数的乘积,通常表示为n!。递归实现阶乘可以这样写: ```csharp public class Factorial { public ...

    汉诺塔源代码

    在C#中实现汉诺塔游戏,可以很好地展示递归算法的应用。 首先,我们要理解C#的基础语法,包括类、方法、变量等。C#是一种面向对象的语言,我们通常会定义一个`Tower`类来表示汉诺塔中的一个柱子,包含一个`List`来...

    C#汉诺塔程序代码

    在C#中实现汉诺塔问题,我们需要理解递归的概念,即函数调用自身来解决更小规模的问题。下面我们将详细探讨如何用C#编写汉诺塔程序。 首先,我们需要定义一个方法,接受三个参数:起始柱、辅助柱和目标柱。这个方法...

    汉诺塔 Hanoi

    汉诺塔(Hanoi)问题,也称为艾斯特拉达问题或移塔问题,是一个经典的递归算法问题,源于19世纪由法国数学家艾德蒙·朗利所提出。问题的目标是将一个堆栈中的所有盘子,通过三个柱子在有限步骤内从初始柱子A移动到...

    Hanoi-Tower.zip_汉诺塔c#_转移圆盘算法

    总的来说,"Hanoi Tower.zip_汉诺塔c#_转移圆盘算法"这个压缩包文件提供了一个C#实现的汉诺塔问题解决方案,通过递归方式展示了如何将圆盘从一个柱子转移到另一个柱子。学习并理解这一算法有助于深化对递归思想和...

    test_im.rar_C#汉诺塔_汉诺塔

    汉诺塔是一个经典的递归问题,它源自印度的古老传说,具有丰富的数学和逻辑思考价值。在C#编程中,我们可以使用递归函数来解决这个问题。这个“test_im.rar”压缩包文件似乎包含了与C#实现汉诺塔游戏相关的代码或...

    汉诺塔游戏.rar

    `HanoiTower`类还应包含一个解决汉诺塔问题的递归算法,通常称为汉诺塔递归函数,其基本思路是: 1. 将A柱子上的n-1个盘子借助B柱子移动到C柱子。 2. 将A柱子剩下的最大盘子直接移动到C柱子。 3. 将B柱子上的n-1个...

Global site tag (gtag.js) - Google Analytics