• 三个char分别代表起始点经过点最终点

  • WriteLine输出是指把盘子由起始点拿到最终点,并不一定是从A到C

  • 故整体思路是先把上面n-1个盘子由A(经过C)拿到B ,再把第n个盘子从A直接拿到C(对应最后return的+1),最后把B的盘子(经过A)拿到C

  • x = 1单独讨论,对应只有一个盘子时直接移动的特殊情况(A->C),同时也是每个递归的终点,表示每次移动单个盘子

public int Hanno(int x,char A,char B,char C)
        {
            int a,b;
            if(x==1)
            {
                Console.WriteLine("{0} -> {1}", A, C);
                return 1;
            }
            else
            {
                a = Hanno(x - 1, A, C, B);
                Console.WriteLine("{0} -> {1}", A, C);
                b = Hanno(x - 1, B, A, C);
                return a + b + 1;
            }
        }
  • 主函数:

static void Main(string[] args)
        {
            Cal x = new Cal();
            Console.WriteLine("汉诺塔->请输入盘数:");
            int n = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("一共移动了{0}次", x.Hanno(n, 'A','B','C'));

        }