算法学习——递归之汉诺塔

本文为作者原创,允许转载,不过请在文章开头明显处注明链接和出处!!! 谢谢配合~
作者:stars-one
链接:https://www.cnblogs.com/stars-one/p/9865560.html

本篇大约有834个字,阅读预计需要1.04分钟


算法描述

汉诺塔问题

如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

算法思路

  1. 1个盘的时候,只需要移动1次即可达成目标,g(1) = 1)(步骤一)

  2. 2个盘的时候,需要移动3次即可达成目标,g(2) = 3(步骤二)

  3. 3个盘的时候,我们需要将底下较大的两个盘先移动到C中,之后再将A中剩下的那个盘移动到C中。

    这里需要注意的是,我们是将底下的2个盘当做了一个,所以是相当于进行了2次步骤二需要2*g(2)次

    之后就是步骤一的那种情况 ,需要1次移动

    g(3)=2*g(2)+1

    通式为g(n)=2*g(n-1)+1

    递归出口为n=1

算法实现

	System.out.println("请输入盘片数:");
	Scanner scanner = new Scanner(System.in);
	int n = scanner.nextInt();
	scanner.close();
	long result = han(n);
	System.out.println("总移动次数为"+result);
}
public static long han(int n){
	long s;
	if(n==1){
		s=1;
	}else{
		s =2*han(n-1)+1;
	}
	return s;
	
}

结果

posted @   Stars-one  阅读(734)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示