二进制与汉诺塔

啊啊啊。小白第一次写还有点儿紧张。。。算是给自己的小记录吧。

看了b站视频,从二进制角度解决递归问题(汉诺塔问题):https://www.bilibili.com/video/BV1rs411Y76X

小想法:递归问题可利用二进制算法解决;而对于任意进制的算法定义是递归的。进位算法和递归的本质上是相似的,由一个大问题以及该大问题下延伸细分出的诸多小问题组成,要解决该大问题,首先就要解决子问题,要解决该子问题,首先就要解决子问题下更小的子问题,这样的思想一直循环直至达到问题的最小单元(可以直接解决),然后就可以反向从小到大解决掉各种子问题,直至顶层的大问题,over。

递归汉诺塔:

void move(int n, char a, char b, char c)
{
    if (n == 1)//只有一个最小圆盘(子问题的最小单元)
    {
        cout << a << "->" << c << endl;
    }
    else
    {
        //将n-1个圆盘从a->b移动(子问题)
        move(n - 1, a, c, b);

        //将未在a上的最小圆盘(比b的最大圆盘大的最小圆盘)从a->c移动
        //相当于进位
        cout << a << "->" << c << endl;

        //将n-1个圆盘从b->c移动(子问题)
        move(n - 1, b, a, c);
    }
}

 

posted @ 2020-06-07 12:26  Waiting-lwt  阅读(152)  评论(0)    收藏  举报