算法 递归

算法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)

 

posted @ 2021-05-20 20:05  luytest  阅读(47)  评论(0编辑  收藏  举报