递归问题(一)

所谓递归问题,可以分成两部分来理解:一是基本问题,也可以称之为原始问题,比较好解决;二是后续问题,比较复杂,但是和原始问题比较类似,可以调用自身的一个新的副本去解决它。

最简单的可以归为递归问题的就是阶乘,1的阶乘我们知道是1,2的阶乘为2*1=2*1!,而3的阶乘又是3*2!...这样我们就能够知道如何用递归去实现n的阶乘了。

public class Factorial { public static int factorial (int n){ int result = 0; if (n <= 1){ result = 1; } else if (n > 1){ result = n * factorial (n-1); } return result; } public static void main (String args[]){ for (int i=0; i<10; i++) System.out.print(factorial (i) +" "); } }

输出:

1 1 2 6 24 120 720 5040 40320 362880

当然了这是最简单的,也是最好理解的递归例子,但是它揭示了递归的实质:将复杂问题递归为简单问题解决...

我们再来看看稍微复杂点的,也比较有意思,汉诺塔问题:有1,2,3这3个柱子,1号柱子上有n个盘子(盘子由小到大地串在上面,且小盘子永远不能在大盘子下面),以2号柱子为临时存放地,最终将n个盘子移到3号柱子上。将这个问题分析为递归问题,分解出以下三点:

1. 从1号柱子移动n-1个盘子到2号柱子,3号柱子为临时存放点;

2. 从1号柱子将第n个盘子移到3号柱子;

3. 将n-1个柱子从2号柱子移到3号柱子,1号柱子为临时存放点。

请看代码:

public class Hanoi { public static void hanoi (int movingPans, String sourcePillar, String targetPillar, String tempPillar){ if (movingPans == 1){ movePans (1, sourcePillar, targetPillar); } else{ hanoi(movingPans-1, sourcePillar, tempPillar, targetPillar); movePans (movingPans, sourcePillar, targetPillar); hanoi(movingPans-1, tempPillar, targetPillar, sourcePillar); } } public static void movePans (int panNum, String sourcePillar, String targetPillar){ System.out.println("Move "+ panNum +" form "+ sourcePillar +"# to "+ targetPillar +"#"); } public static void main(String args[]){ System.out.println("3个盘子的汉诺塔问题:"); hanoi(3, "1", "3", "2"); System.out.println("5个盘子的汉诺塔问题:"); hanoi(5, "1", "3", "2"); } }

输出:

3个盘子的汉诺塔问题: Move 1 form 1# to 3# Move 2 form 1# to 2# Move 1 form 3# to 2# Move 3 form 1# to 3# Move 1 form 2# to 1# Move 2 form 2# to 3# Move 1 form 1# to 3# 5个盘子的汉诺塔问题: Move 1 form 1# to 3# Move 2 form 1# to 2# Move 1 form 3# to 2# Move 3 form 1# to 3# Move 1 form 2# to 1# Move 2 form 2# to 3# Move 1 form 1# to 3# Move 4 form 1# to 2# Move 1 form 3# to 2# Move 2 form 3# to 1# Move 1 form 2# to 1# Move 3 form 3# to 2# Move 1 form 1# to 3# Move 2 form 1# to 2# Move 1 form 3# to 2# Move 5 form 1# to 3# Move 1 form 2# to 1# Move 2 form 2# to 3# Move 1 form 1# to 3# Move 3 form 2# to 1# Move 1 form 3# to 2# Move 2 form 3# to 1# Move 1 form 2# to 1# Move 4 form 2# to 3# Move 1 form 1# to 3# Move 2 form 1# to 2# Move 1 form 3# to 2# Move 3 form 1# to 3# Move 1 form 2# to 1# Move 2 form 2# to 3# Move 1 form 1# to 3#

请看本篇blog的续集:《递归问题二》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值