汉诺塔程序

本文介绍了一个使用C语言实现的汉诺塔问题解决方案。通过自定义move和hannuota函数,实现了汉诺塔问题的递归求解,并详细展示了当块数为3时的具体移动步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# include "stdio.h"
void move(char x, char y) //自定义move函数,用来将块从起始柱子x移动到目标柱子y,这里的x,y为形参,不代表具体哪根柱子

{
    printf("\t%c-->%c\n",x,y);
}
void hannuota(int n, char a, char b, char c) //自定义hannuota函数,这里的a,b,c为形参,不代表具体哪根柱子

{
    if (n == 1)
        move(a, c); //调用自定义函数move
                                                                       
    else                                                               
                                                                       
    {        
        hannuota(n-1, a, c, b);  //第一行递归
        
        move(a, c);  //调用自定义函数move
        
        hannuota(n-1, b, a, c);  //第二行递归
        
    }
}


int main(void)

{
    int n;
    
    printf("请输入要移动的块数:\n");
    scanf("%d", &n);
  
    hannuota(n, 'a', 'b', 'c');
    
    return 0;
}
/*执行详细步骤:当n = 3 时
                 n = 3           n = 2          n = 1
                
                |               |h(1, a, b, c)=>move(a, c)=> a->c      //1
                |h(2, a, c, b)    |move(a, b)                  a->b      //2
                |               |h(1, c, a, b)=>move(c, b)=> c->b      //3
                |
h(3, a, b, c)    |move(a, c)                                  a->c      //4
                |
                |               |h(1, b, c, a)=>move(b, a)=> b->a      //5                      
                |h(2, b, a, c)    |move(b, c)                  b->c      //6
                |               |h(1, a, b, c)=>move(a, c)=> a->c      //7
                |

执行结果:
请输入要移动的块数:
3
a-->c
a-->b
c-->b
a-->c
b-->a
b-->c
a-->c
*/

 关于一个函数的递归调用,使用V模型,逐项深入,逐项返回,用“栈”的思路去理解;

http://www.cnblogs.com/zhangqqqf/archive/2008/09/12/1289730.html

两个函数的自身递归,使用"满二叉树"的模型,语句块可以逐步分解。。

关于递归树http://hi.baidu.com/sei_zhouyu/item/e5ce9110fcdb86f09c778ab3

转载于:https://www.cnblogs.com/fickleness/p/3143990.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值