迭代法塔的问题,如果中国

迭代法塔的问题,如果中国

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

看递归解决方案。使用Perl语言完成了不到一分钟。

sub hanno_recursive {
my ($from, $to, $reserve, $n) =  @_;
if (1 == $n) {
print “move $n from $from to $to\n”;
return;
}

hanno_recursive($from, $reserve, $to, $n -1);
print “move $n from $from to $to\n”;
hanno_recursive($reserve, $to, $from, $n -1);
}

极其简洁优美。充分体现了递归的优雅。

接下来。考虑迭代解法。考虑将问题分解为树结构。非常显然, 将A   B  C看成一个圈, 则左右子树具有某种对称。即顺时针或逆时针旋转。

这样。我们全然能够通过左树求得右树, 问题变成为了线性递归, 这个非常easy转换为迭代。

原理知道了, 写这个代码,还是比較费劲, 花了1个小时才调好。

sub hanno_iterate {
my ($from, $to, $reserve, $n) =  @_;
my @left = ();
my @right = ();
#move to leaf node
my $count = $n;
while ($count > 1) {
my $tmp = $to;
$to = $reserve;
$reserve = $tmp;
$count–;
}

for (my $index = 1; $index <= $n; $index++) {
my $new = “move $index from $from to $to\n”;

push @left, $new;
while ($new = shift @right) {
push @left, $new;
}
last if ($index == $n);

if (($index % 2) == ($n % 2)){
# anti-clock $from -> $to, $reserve->$from, $to -> $reserve
foreach my $opt(@left) {
my $left_value = “$opt”;
$left_value =~ tr/ABC/CAB/;
push @right, $left_value;
}
} else {
# clock $from -> $reserve, $reserve->$to, $to -> $from
foreach my $opt(@left) {
my $left_value = “$opt”;
$left_value =~ tr/ABC/BCA/;
push @right, $left_value;
}
}
my $tmp = $to;
$to = $reserve;
$reserve = $tmp;
}

foreach my $opt(@left) {
print $opt;
}

}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117628.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python to exe transporter: py2exe Test report「建议收藏」

    python to exe transporter: py2exe Test report「建议收藏」pipinstallpy2exefromdistutils.coreimportsetupimportpy2exesetup(windows=[{“script”:”123.py”}])Thisreportisonlyusedtorecord.

    2025年10月23日
    3
  • 正则匹配数字,英文以及英文符号

    正则匹配数字,英文以及英文符号网上搜索很多正则验证方法,但都没有一个理想的解决方式。自己总结了下,对于这个问题目前是两种解决方式。1、通过循环字符串对每一个字符进行验证,这个方式简单就不做介绍了2、通过ASCII码匹对符合的次数来判断是否匹配(不要循环)第二种方式是不通过循环来进行正则的验证到达检测效果,这也是博主没找到合适的方法原因(总觉循环没必要)。newRegExp(“[\x20-\x7E]{“+str.length+”}”)通过数字,英文以及英文符号ASCII码的范围对字符串验证,并且加上其出现的次数,如果没有出现

    2022年6月22日
    165
  • 哈希表的数据结构[通俗易懂]

    转载自:https://www.jianshu.com/p/b468abd86f61Hash表的结构图:数组+链表哈希表(Hashtable,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表白话一点的说就是通过把Key通过一个固定的算法函数(hash函数)转换成一个整型数字,然后就对该数字对数组的长度进行取余,取余结果就

    2022年4月9日
    50
  • Java——数组的定义与使用「建议收藏」

    Java——数组的定义与使用「建议收藏」目录1.数组2.数组初始化2.1动态初始化(声明并开辟数组)2.2引用传递的内存分析2.3静态初始化(开辟同时赋值)3.二维数组4.数组与方法互操作5.Java对数组的支持5.1排序:5.2拷贝6.对象数组6.1动态初始化1.数组一组相关类型的变量集合缺点:长度固定,存在越界问题2.数组初始化 2.1动态初始化…

    2022年5月22日
    42
  • toast弹窗教程_toast提示是什么

    toast弹窗教程_toast提示是什么2.3.1 反编译APK安装包首先,需要从网上下载样本安装包,这里使用的样本是哒哒文件助手,读者可以从安卓市场下载。在反编译APK之前,还需要从网上下载第三方模拟器,如夜神、雷电等模拟器。安装下载好的样本,运行看一下效果,大概了解一下该APK实现的相关功能,如图2.6所示,该界面就是程序入口界面。                   图2.6…

    2025年11月23日
    2
  • 网络流媒体协议之——RTSP协议

    网络流媒体协议之——RTSP协议RTSP(Real-TimeStreamProtocol)协议是一个基于文本的多媒体播放控制协议,属于应用层。RTSP以客户端方式工作,对流媒体提供播放、暂停、后退、前进等操作。该标准由IETF指定,对应的协议是RFC2326。RTSP作为一个应用层协议,提供了一个可供扩展的框架,使得流媒体的受控和点播变得可能,它主要用来控制具有实时特性的数据的发送,但其本身并不用于传送流媒体数据,而

    2022年7月16日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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