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

来源:互联网 发布:单键实现单片机开关机 编辑:程序博客网 时间:2024/06/05 17:15
  • 汉诺塔的递归分析
    数学规律分析
    这里写图片描述
    算法分析
    汉诺塔的算法就3个步骤:
    第一,把a上的n-1个盘通过c移动到b。
    第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。
    这个算法看起来就简单多了。不过,思考和体会的过程需要很多理解。我自己的理解是,每次对象就是两个盘子(从1个开始,依次配对),较小的盘子移动到辅助的柱子,露出来较大的柱子,把较大的移动到目标柱子上,最后把较小的柱子移动到目标柱子。
#include "stdafx.h"#include <iostream>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');}

代码解法的理解
这里写图片描述
文字部分是我对于程序处理不同的盘子个数做的说明。这个move()函数的参数包括当前移动的盘子的编号、和它将要用到的3个柱子。

原创粉丝点击