教你轻松理解汉诺塔问题

  • 格式:doc
  • 大小:54.50 KB
  • 文档页数:2

下载文档原格式

  / 2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

轻松解决哈诺塔问题
中国地质大学(武汉)地学院 李仙伟
这个问题已经是老生常谈了, 不过本人对问题的解决追求一种简单又容易理解的方式, 凡事只 有自己弄懂了算真正学会了知识,记忆才会深刻,也才能熟练运用知识。
汉诺塔的解决在程序里实际上是一个函数递归调用的过程。假设 A 上有 n 个盘子,求解的大 致想法是想把 A 最上面的 n-1 个盘子借助 C 挪到 B,接着把 A 最下面的最大的盘子挪到 C,再把 B 上的 n-1 个盘子借助 A 挪到 C,完成。 首先先看 C#里解决这个问题的代码:
using System; using System.Collections.Generic; using System.Text; namespace Hanoi { class Program { private static void Move(int n, char A, char B, char C) { if (n == 1) { Console.WriteLine("Move disc: {0}--->{1}", A, C); return; } Move(n-1, A, C, B);// 把A最上面的n-1个盘子借助C挪到B Console.WriteLine("Move disc: {0}--->{1}", A, C);// 把A最下面的最大的盘子挪到C Move(n-1, B, A, C); //把B上的n-1个盘子借助A挪到C } static void Main(string[] args) { Console.Write("输入盘子数量:"); int n = Convert.ToInt16(Console.ReadLine()); Move(n, 'a', 'b', 'c'); Console.Read(); }

} }
运行程序,输入盘子数3,结果如下所示:
对这个问题的理解可以通过一个实例来认知, 首先简化代码,用3代替n, 将以上代码简写并展开为:
以上的①—⑦就是求解的结果,顺序从上到下,如有所示: 无论 n 为多少,依此类推, ,关键是想通了就 OK 了