算法分析--汉诺塔的递归

  • 汉诺塔的递归分析
    数学规律分析
    算法分析--汉诺塔的递归_第1张图片
    算法分析
    汉诺塔的算法就3个步骤:
    第一,把a上的n-1个盘通过c移动到b。
    第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。
    这个算法看起来就简单多了。不过,思考和体会的过程需要很多理解。我自己的理解是,每次对象就是两个盘子(从1个开始,依次配对),较小的盘子移动到辅助的柱子,露出来较大的柱子,把较大的移动到目标柱子上,最后把较小的柱子移动到目标柱子。
#include "stdafx.h"
#include 
using namespace std;
/*汉诺塔问题的递归求解
*/

void move(int n,char a,char b,char c)
{
    if(n==1){
        printf("这是n=1时的 ");
        printf("\t%c->%c\n",a,c);    //当n只有1个的时候直接从a移动到c
    }
    else
    {
        move(n-1,a,c,b);            //第n-1个要从a通过c移动到b
        printf("这是!=1时的 ");
        printf("\t%c->%c\n",a,c);
        move(n-1,b,a,c);            //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解
        printf("这是路过的\n ");
    }
}

void main()
{
    int n;
    printf("请输入要移动的块数:");
    scanf("%d",&n);
    move(n,'a','b','c');
}

代码解法的理解
算法分析--汉诺塔的递归_第2张图片
文字部分是我对于程序处理不同的盘子个数做的说明。这个move()函数的参数包括当前移动的盘子的编号、和它将要用到的3个柱子。

你可能感兴趣的:(算法*)