首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >迭代法塔的问题,如果中国

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

作者头像
全栈程序员站长
发布2022-07-05 20:44:26
发布2022-07-05 20:44:26
3190
举报

大家好,又见面了,我是全栈君,今天给大家准备了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.cn/117628.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档