C# 使用递归方法实现汉诺塔步数计算

C# 使用递归方法实现汉诺塔步数计算

  • [Part 1 什么是递归](#Part 1 什么是递归)
  • [Part 2 汉诺塔](#Part 2 汉诺塔)
  • [Part 3 程序](#Part 3 程序)

Part 1 什么是递归

举一个例子:计算从 1 到 x 的总和

c 复制代码
public int SumFrom1ToX(int x)
{
    if(x == 1)
    {
        return 1;
    }
    else
    {
        int result = x + SumFrom1ToX_2(x - 1);  // 调用自己
        return result;
    }
}

Part 2 汉诺塔

有三个石柱,在最左侧的石柱上从小到大摆放 N 层盘片,需要从最左侧的石柱移动到最右侧的石柱上,中间的石柱作为缓冲,一次只能移动一个盘片,且无论何时较小的盘片始终在较大的盘片上面。

这个问题求解这过程中搬运的次数

Part 3 程序

创建一个Move函数来移动盘子

c 复制代码
static void Move(int pile, char src, char temp, char dst)
{

}

pile 是最左侧的盘片数量,src 是起始点,temp 是中间的缓冲区,dst 是终点

c 复制代码
Move(pile - 1, src, dst, temp); // 将pile-1层盘片从src经过dst移动到temp
Move(1, src, temp, dst); // 将最底层的盘片从src移动到dst
Move(pile - 1, tmp, src, dst); // 将pile-1层汉诺塔从temp经过src移动到dst

Move 方法的代码

c 复制代码
static void Move(int pile, char src, char temp, char dst)
{
    if (pile == 1)
    {
        Console.WriteLine($"{src} --> {dst}");
        steps++;
        return;
    }

    Move(pile - 1, src, dst, temp);
    Move(1, src, temp, dst);
    Move(pile - 1, temp, src, dst);
}

完整代码

c 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleHelloWorld
{
    class Hanoi
    {
        public static int steps = 0;

        public void ShowHanoiPath(int levels)
        {
            Console.WriteLine("输入的汉诺塔层数是:{0}", levels);
            Move(levels, 'A', 'B', 'C');
            Console.WriteLine("一共移动了{0}次", steps);
        }

        static void Move(int pile, char src, char temp, char dst)
        {
            if (pile == 1)
            {
                Console.WriteLine($"{src} --> {dst}");
                steps++;
                return;
            }

            Move(pile - 1, src, dst, temp);
            Move(1, src, temp, dst);
            Move(pile - 1, temp, src, dst);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Hanoi hanoi = new Hanoi();
            hanoi.ShowHanoiPath(4);
        }
    }
}
相关推荐
xlxxy_6 分钟前
sap获取批次特性报表
java·linux·开发语言·前端·数据库·abap·mm
北冥you鱼8 分钟前
Go语言常用包使用指南:从标准库到第三方利器
开发语言·microsoft·golang
我才是银古15 分钟前
一个人写出的 3D 几何引擎:Ara3D SDK 技术深度剖析
c#·三维几何·ai平台
俺不中嘞16 分钟前
python常用函数
开发语言·python
欢喜躲在眉梢里25 分钟前
用飞算Java做了一套新能源充电运营管理系统:把站点、设备、订单拆成可运营的微服务
java·开发语言·微服务·ai编程·技术分享·java开发·飞算javaai炫技赛
এ慕ོ冬℘゜1 小时前
深入理解 JavaScript 事件对象:从 target 到 preventDefault 的实战指南
开发语言·前端·javascript
学逆向的1 小时前
汇编——修改EIP的值
开发语言·汇编·网络安全
weixin_422329311 小时前
AgentScope Java ReActAgent 核心循环深度解析
java·开发语言·人工智能
weilaieqi11 小时前
行业前列!CASAMANIA HORM富森美高端意式沙发标杆
开发语言
小二·2 小时前
WebGPU 浏览器端跑大模型:让AI在网页里跑起来(WebLLM/Transformers.js实战)
开发语言·javascript·人工智能