汉罗塔的一般解决方法是什么_汉诺塔最快的方法

汉罗塔的一般解决方法是什么_汉诺塔最快的方法这里主要是汉罗塔的递归求解n个盘子的总步数,和递归每一步盘子的步骤。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

 汉罗塔的一般解法

                   一般来说,汉罗塔大多数人都是玩过了的。并且有一个很容易得到的规律,那就是先要将前(n – 1)项移动到过渡桩上面去,然后将最后一盘放在最终放的位置,然后再将(n – 1) 个盘子移动到最终位子。那么就完成了汉罗塔。

                      
不管是多少个盘子,只要他的柱子只有三个,那么解法都是这个模式,所以很容易得到递归求解,如果是求总的移动次数,那么递归写法应该是如下:
 

#include <stdio.h>
int f(int n) // n是盘子数
{
	if(1 == n)
	{
		return 1; //很容易得到 一个盘子当然只需要移动一次就得到结果
	}
	else
	{
		return f(n - 1)*2 + 1; // 简化版
		//return f(n - 1) + 1 + f(n - 1); 
		// 这上面的式子的意思正如我上面所说 ,先将前n - 1 个盘子移动到过渡桩上面去,然后移动最后一个盘子,再移动前 n - 1 个盘子
		// 所以是 f(n - 1) 的移动次数 加上最后一个盘子移动的一次 再加上f(n - 1)个盘子移动的次数 得到总次数
	}
}
int main()
{
	int n;
	scanf("%d",&n); //盘子数
	printf("%d个盘子总共移动次数为: %d",n,f(n));
	return 0;
}
	以上就是求解n个盘子需要移动的次数
	而有时侯有的题目会考每次移动的盘子的步骤打印出来,那么就需要将上面的递归改变一下就可以得到每步的怎么移动的了
	如下:
	PS: 我就直接写递归函数了 
	void f(int n, char begin,char end,char through)
	{
		if(1 == n)
		{
			printf("%c -> %c\n",begin,end);
		}
		else
		{
			f(n - 1,begin,through,end); //移动前n - 1 个盘子到过渡盘
			printf("%c -> %c\n",begin,end); // 将最后一个盘移动到最终柱子
			f(n - 1,through,end,begin); // 将 n - 1 个盘子移动到最终柱子
		}
	}
	如上就是每步盘子是如何移动的递归程序,只要明白了基本的移动方式,那么写出汉罗塔递归程序还是很好写的。
 
 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182680.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vue——二级菜单demo

    vue——二级菜单demo学习了vue,最近想着写一写demo练一练,今天写的二级菜单,中间踩过很多坑1、存数据:最开始想着一级菜单存一个数组,二级菜单存不同的数组。那么问题来了,一级菜单和二级菜单应该是超级相关联的,如果分开存储再去建立关系很麻烦,所以存在一个数组对象中,那么也就是说,不管多少级菜单都可以这样,又方便还不需要我们自己去建立相关关系。2、‘^’的变化,最开始想着不同状态用v-show去操作dom…

  • linux PS1 提示符定义[通俗易懂]

    linux PS1 提示符定义[通俗易懂]PS1:就是用户平时的提示符。PS2:第一行没输完,等待第二行输入的提示符。Linux系统提示符是用系统变量PS1来定义的。一般系统默认的形式是:[username@host工作目录]$.用e

  • Basename_dirname

    Basename_dirnamebasenamebasename去除文件名的目录部分和后缀部分。返回一个字符串参数的基本文件名称。语法:basenameNAME[SUFFIX]basenameOPTION用法:$basename/home/me/desktop/test.txt输出:test.txt可以指定suffix参数:$basename/home/me/d

  • navicat 15激活码(破解版激活)

    navicat 15激活码(破解版激活),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • hdu2377Bus Pass(构建更复杂的图+spfa)

    hdu2377Bus Pass(构建更复杂的图+spfa)

  • Mac 终端命令行读写NTFS硬盘方法[通俗易懂]

    Mac 终端命令行读写NTFS硬盘方法[通俗易懂]1.插入移动硬盘后,先查看移动硬盘的名称:mount|grepntfs这里的MyPassport是我的移动硬盘,可以看到它实际位置是/dev/disk2s12.先把移动硬盘卸载sudoumount/dev/disk2s13.建立挂载点,并重新挂载,这里我还是把它挂载在Volumes目录下,并新建文件夹cd/VolumesmkdirMy\Passport/使用自带的mount_ntfs就可以完成挂载了。sudomount_ntf…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号