算法 递归
算法1:输入1~5时,输出的结果分别是1,1,2,3,5......输入20时,结果是多少?
public static int DiGui1(int num) { int result = 1; //分析 //输入1,2时,输出都是1,因此是特殊情况,单独处理 //从输入n(n>=3)开始,结果是输入n-2加上输入n-1 switch (num) { case 1: case 2: result = 1; break; default: result = DiGui1(num - 2) + DiGui1(num - 1); break; } return result; }
结果是 6765。
算法2:汉诺塔,用程序模拟移动过程
假定3个柱子是a,b,c,我们把a上的2片圆盘(按从小到大是1,2)移动到c上去,步骤是这样
1.把1从a移动到b;
2.把2从a移动到c;
3.把1从b移动到c。
一共3步
3片圆盘步骤是这样
1.把1从a挪到c;
2.把2从a挪到b;
3.把1从c挪到b;
4.把3从a挪到c;
5.把1从b挪到a;
6.把2从b挪到c;
7.把1从a挪到c。
一共7步
由此可见,加一个圆盘,步骤多了很多,那么我们如果将,1,2圆盘看做一个整体,3圆盘看做另一个整体,解法岂不是就像2个圆盘那样,只是1,2整体移动到b需要经过c(步骤1,2,3),3移动到c直接移(步骤4),1,2整体移动到c需要经过a(步骤5,6,7)。
当有n个圆盘时
1.把n-1个圆盘从a经过c移动到b;
2.把n圆盘从a移动到c;
3.把n-1个圆盘从b经过a移动到c。
n-1是个比n规模小1的子问题,这就可以用递归来实现。
结果测试3个盘子
试试4个盘子
64我可不敢试......因为它的时间复杂度大概是O(2^n)