递归算法

递归(即递推与回归)

递归调用指的是该方法在执行的过程中遇到它自己本身的调用(即自己调用自己)

递归算法的两个条件:

  1:含有递归出口(结束条件)

  2:逐层递归向出口逼近

递归的思想:将一个大的事物分解成若干个小的事物且每一次使用的方法都相同


举例:

汉诺塔问题:

 如图所示, 从左到右有A、B、C三根柱子,其中A柱子上面有从小到大的n个圆盘,现要求将A柱子上的原盘移到C柱子上去。

 移动规则:

  一次只能移动一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

分析:

当A棒上只有一个盘子时,直接将这个盘子移到C棒上。

当A棒上有两个盘子时,先将A棒1号盘子(从上到下编号)移到B棒也就是辅助棒上,再将A棒上的2号盘子移到C棒上,最后将B棒上的盘子移到C棒上。

当A棒上有三个盘子时,先将A棒上编号1~2的两个盘子移到B棒上(这个过程需要借助C棒),然后再将A棒上编号为3的盘子移到C棒上,最后再借助A棒将B棒上的两个盘子移动到C棒上。

.....

当A棒上有n个盘子时,先将A棒上的前1~(n-1)个盘子移动到B棒上(需要借助C棒),然后再将A棒上编号为n的盘子移到C棒上,最后再借助A棒将B棒上的n-1个盘子移动到C棒上

综上所述:当且仅当只有一个盘子时不需要借助辅助棒,其余情况均一样

这时我们就可以采用递归算法来解决这个问题:

	/**
	 * 
	 * @param num :圆盘个数
	 * @param start  : 起始棒
	 * @param help : 辅助棒
	 * @param dest : 目标棒
	 */
	public static void hanoi(int num,char start,char help,char dest){
		if(num==1){     //当只有一个盘子时直接移动
			count++;
			System.out.println("第"+count+"次移动,从"+start+"棒移动到"+dest+"棒");
		}else{
			hanoi(num-1,start,dest,help); //借助C棒将n-1个圆盘移动到B棒上
			count++;
			System.out.println("第"+count+"次移动,从"+start+"棒移动到"+dest+"棒");
			hanoi(num-1,help,start,dest); 
		}
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值