算法学习——递归之汉诺塔

算法描述

汉诺塔问题算法

以下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数code

算法思路

  1. 1个盘的时候,只须要移动1次便可达成目标,g(1) = 1)(步骤一)blog

  2. 2个盘的时候,须要移动3次便可达成目标,g(2) = 3(步骤二)递归

  3. 3个盘的时候,咱们须要将底下较大的两个盘先移动到C中,以后再将A中剩下的那个盘移动到C中。im

    这里须要注意的是,咱们是将底下的2个盘当作了一个,因此是至关于进行了2次步骤二须要2*g(2)次next

    以后就是步骤一的那种状况 ,须要1次移动static

    g(3)=2*g(2)+1img

    通式为g(n)=2*g(n-1)+1移动

    递归出口为n=1co

算法实现

System.out.println("请输入盘片数:");
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    scanner.close();
    long result = han(n);
    System.out.println("总移动次数为"+result);
}
public static long han(int n){
    long s;
    if(n==1){
        s=1;
    }else{
        s =2*han(n-1)+1;
    }
    return s;
    
}

结果

相关文章
相关标签/搜索