河内塔的递归算法的分析

有A,B,C三根柱子,A柱子上面有若干个盘子,从小到大的一次堆放着(上大下小)

现欲把A上的盘子挪到C上,且遵守大盘子在小盘子之下的原则


递归算法的描述:


我们可以将问题缩小化,总是将n-1个盘子挪到B上,然后将最大的盘子挪到C上

当有两个盘子的时候可以将小的挪到B上,然后将大的挪到C上

有三个的时候,可以将第一个和第二个挪到B上,然后将大的挪到C上

以此类推.....


当有三个时候,将1,2挪到B上,将3,挪到C上,

需要将1,2先挪到B上,我们必须让程序具有一致性,因为程序并不知道那个是A,B,C

由于我们始终都是让A挪到C

所以将B作为C,

A-->B======>>A-->C

然后我们需要将1,2再次挪到C上,

目的地是C,运行的是B-->C,

同上,我们需要将B换成A

所以 B-->C====>>A-->C


替换的时候可以再参数传递的时候实现

算法如下:

#include
  
  
   
   
void Hanoi(int n,char a,char b,char c)
{
    if(n==1)        //剩余一个盘子
    {
        printf("%d 号盘子   %c---->%c",n,a,c);
    }else
    {
        Hanoi(n-1,a,c,b);
        printf("%d 号盘子   %c---->%c",n,a,c");
        Hanoi(n-1,b,a,c);           //始终保持是A--->C
    }

}

int main(void)
{
    int n;
    printf("请输入盘子的总数:");
    scanf("%d",&n);
    Hanoi(n,'a','b','c');

    return 0;
}

  
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值