码迷,mamicode.com
首页 > 编程语言 > 详细

算法——汉诺塔问题(递归典型)

时间:2019-02-09 11:58:28      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:size   alt   递归   http   process   The   上下   proc   印度   

汉诺塔

汉诺塔是一个发源于印度的益智游戏,也叫河内塔。相传它源于印度神话中的大梵天创造的三个金刚柱,一根柱子上叠着上下从小到大64个黄金圆盘。大梵天命令婆罗门将这些圆盘按从小到大的顺序移动到另一根柱子上,其中大圆盘不能放在小圆盘上面。当这64个圆盘移动完的时候,世界就将毁灭。


技术图片

算法分析:

一阶汉诺塔的移动,显而易见,从 A->C

技术图片

然后,我们可以探讨二阶与一阶的联系:

 技术图片

不光是对于二阶,其实N阶汉诺塔相当于执行了三大步骤: 

1.在ACB的顺序下执行了(N-1)阶汉诺塔的移法 
2.从A->C移动了第N个盘(最大的) 
3.在BAC的顺序下执行了(N-1)阶汉诺塔的移法
 

分析清楚,那么代码就很简单了。

void process(int n,string A,string B,string C) {
    if (n == 1) {
        cout << "move from 1 " << A << " to " << C << endl;
        return;
    }
    process(n - 1, A, C, B);
    cout << "move from " <<n<<" "<< A << " to " << C << endl;
    process(n - 1, B, A, C);
}

 复杂度分析:

根据递归,我们很容易得到一个等式,T(n) = T(n-1) + 1 + T(n-1) = 2T(n-1) + 1 ,时间复杂度是O(2^n - 1),证明也很容易。

技术图片

算法——汉诺塔问题(递归典型)

标签:size   alt   递归   http   process   The   上下   proc   印度   

原文地址:https://www.cnblogs.com/czc1999/p/10357202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!