zoukankan      html  css  js  c++  java
  • 算法学习——递归之汉诺塔

    算法描述

    汉诺塔问题

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

    算法思路

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

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

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

      这里需要注意的是,我们是将底下的2个盘当做了一个,所以是相当于进行了2次步骤二需要2*g(2)次

      之后就是步骤一的那种情况 ,需要1次移动

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

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

      递归出口为n=1

    算法实现

    	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;
    	
    }
    

    结果

  • 相关阅读:
    16 js动态添加样式
    15 document对象
    89 多线程(十...)——线程池
    14 window对象
    13 js事件2——选择合适的事件
    12 js事件
    11 js的常用类和方法
    10 js自定义对象
    09 js自定义类与prototype关键字
    88 maven配置库,dom4j
  • 原文地址:https://www.cnblogs.com/stars-one/p/9865560.html
Copyright © 2011-2022 走看看