汉诺塔递归算法

解决汉诺塔问题的思路:

  1. 如果只有一个金片,则把该金片从源移动到目标棒,结束。

  2. 如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒。

对于汉诺塔问题的求解,可以通过以下三个步骤实现:

  1. 将塔A上的n-1个碟子借助塔C先移到塔B上。

  2. 把塔A上剩下的一个碟子移到塔C上。

  3. 将n-1个碟子从塔B借助塔A移到塔C上。

 

C版本

#include<stdio.h>
  
void move(int n,char a,char b,char c)
{
    if(n==1)
        printf("\t%c->%c\n",a,c);    //当n只有1个的时候直接从a移动到c
    else
    {
        move(n-1,a,c,b);            //第n-1个要从a通过c移动到b
        printf("\t%c->%c\n",a,c);
        move(n-1,b,a,c);            //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解
    }
}
  
main()
{
    int n;
    printf("请输入要移动的块数:");
    scanf("%d",&n);
    move(n,'a','b','c');
}

 

 

java版本

  public static void main(String args[]) throws Exception {
             int n = 3;
             Test test = new Test();
             test.move(n, 'A', 'B', 'C');
         }
     
         public  void move(int n, char a, char b, char c) {
             if (n == 1){
                 System.out.println("num: " + n + " from " + a + " to " + c);
             }else {
                 move(n - 1, a, c, b);
                 System.out.println("num: " + n + " from " + a + " to " + c);
                 move(n - 1, b, a, c);
             }
         }

 

posted @ 2016-08-06 22:36  N神3  阅读(1317)  评论(0编辑  收藏  举报