汉诺塔:
单看这个问题描述有点让人抓瞎,这是当然,无论多么简单的问题描述,在没有建立具体地模型之前都是让人不知所云的,仅仅用生活中的语言去描述一些数学或算法问题往往会让听者产生理解偏差,这也和每个的理解能力和思维方式有很大关系,这就显示出数学的强大了,数学让问题不再模糊,参数和公式组成的模型让问题不再有理解偏差和误区,只可惜数学没学好,看来以后还得回来把高数、概率论这些给补回来。
说了一些题外话,下面来对汉诺塔问题进行解释和建立模型
下面我用图来描述64个盘子的转移流程
using System; using System.Collections.Generic; namespace 汉诺塔问题_递归解决 { class Program { static void Main(string[] args) { HanNuo(64, 'a', 'b', 'c'); Console.ReadKey(); } /// <summary> /// 汉诺塔问题解决方法 /// </summary> /// <param name="n">汉诺塔的层数</param> /// <param name="a">承载最初圆盘的柱子</param> /// <param name="b">起到中转作用的柱子</param> /// <param name="c">移动到的目标柱子</param> static void HanNuo(int n, char a, char b, char c) { if (n == 1) //这也是递归的终止条件 { Console.WriteLine("将盘子[{0}]从 {1} -----> {2}", n, a, c); //控制台输出每次操作盘子的动向 } else { HanNuo(n - 1, a, c, b); //将a柱子上的从上到下n-1个盘移到b柱子上 Console.WriteLine("将盘子[{0}]从 {1} -----> {2}", n, a, c); HanNuo(n - 1, b, a, c); //将b柱子上的n-1个盘子移到c柱子上 } } } }
文章来源: 图解汉诺塔问题(递归求解)