递归法解决汉诺塔(hanoi)问题,附详细运行过程

//先看代码,下面有详细运行过程

void move(int n,int x,int y,int z)
{   if(n==1)
        printf("%c-->%c\n",x,z);
    else
    {   move(n-1,x,z,y);
        printf("%c-->%c\n",x,z);
        move(n-1,y,x,z);
    }
}
main() {
    int n;
    printf("请输入n的值\n");
    scanf("%d",&n);
    move(n,'A','B','C');
}

 

第一层函数:m(3,A,B,C)

进入else m(2,A,C,B)

第二层函数:m(2,A,C,B)

再次进入else m(1,A,B,C)

第三层函数:m(1,A,B,C)

m(1,A,B,C)进入if打印A→C,此层结束

返回第二层

 

第二层函数:m(2,A,C,B)

else m(1,A,B,C)已经执行完,接着执行下面代码,打印A→B,继续下面代码

m(1,C,A,B)

进入函数,执行if语句,打印C→B

至此,第二层全部运行结束

回到第一层

 

第一层函数:m(3,A,B,C)

进入else m(2,A,C,B)已经执行完毕

,接着执行下面代码,打印A→C,继续执行下面代码

m(2,B,A,C)

再一次,进入递归

第一层:m(2,B,A,C)

else m(1,B,C,A)

第二层:m(1,B,C,A)

进入if语句,打印B→A,至此第二层结束,回到第一层

第一层:m(2,B,A,C)

else m(1,B,C,A)已经执行完,接着执行下面代码,打印B→C,继续下面代码

m(1,A,B,C)

再次进入函数,进入if语句,执行A→C

至此,整个程序运行结束

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值