利用函数递归调用实现汉诺塔

/*

*wuxiuwen

*利用函数递归调用实现汉诺塔

*/

#include<stdio.h>


int count; //打印的行数,同时可以看进行了多少次的操作

int hanio(int i,char from,char tmp,char to);  //汉诺塔的函数,利用函数递归调用
int move(char,char);    //操作
int input(void);     //输入操作

int main()
{
        hanio(input(),'A','B','C');
        return 0;
}
int input()
{
        int num=0;
        printf("please input a number: \n");
        scanf("%d",&num);
        printf("the action is :\n");
        return num;
}
int move(char from,char to)
{
        count++;
        printf("%d : move %c to %c\n",count,from,to);
        return 0;
}
int hanio(int i,char from,char tmp,char to)
{
        if(1==i)
        {
                move(from,to);
        }
        else
        {
                hanio(i-1,from,to,tmp);
                move(from,tmp);
                hanio(i-1,tmp,from,to);
        }
        return 0;

}

//*******************************************//

利用函数递归调用实现汉诺塔,该函数从外层进行深入函数中,进行一层层调用,然后一层层返回。

编译,执行,输入4,结果如下:

[root@localhost wuxiuwen]# ./a.out 
please input a number: 
4
the action is :
1 : move A to B
2 : move A to B
3 : move B to C
4 : move A to C
5 : move C to A
6 : move C to A
7 : move A to B
8 : move A to B
9 : move B to C
10 : move B to C
11 : move C to A
12 : move B to A
13 : move A to B
14 : move A to B
15 : move B to C

[root@localhost wuxiuwen]# 

********************************end ************************

### Python递归函数实现汉诺塔问题 汉诺塔是一个经典的递归问题,其核心在于理解递归的思想以及柱子角色的变化。以下是基于提供的参考资料和专业知识编写的解决方案。 #### 汉诺塔问题描述 汉诺塔的目标是从起始柱(`A`)将所有的盘子移动到目标柱(`C`),借助缓冲柱(`B`)。在此过程中需遵循以下规则: 1. 每次只能移动一个盘子。 2. 移动过程中大盘子不能压在小盘子上方。 --- #### 示例代码实现 下面是使用Python递归函数实现汉诺塔问题的代码: ```python def hanoi(n, source, auxiliary, target): """ 使用递归方法解决汉诺塔问题 参数: n (int): 需要移动的盘子数量 source (str): 起始柱名称 ('A') auxiliary (str): 缓冲柱名称 ('B') target (str): 目标柱名称 ('C') """ if n == 1: # 基础情况:当只有一个盘子时直接从source移到target print(f"Move disk 1 from {source} to {target}") return # 将前n-1个盘子从source移至auxiliary,利用target作为辅助 hanoi(n - 1, source, target, auxiliary) # 移动第n个盘子从source到target print(f"Move disk {n} from {source} to {target}") # 将剩余的n-1个盘子从auxiliary移至target,利用source作为辅助 hanoi(n - 1, auxiliary, source, target) # 测试代码 if __name__ == "__main__": num_disks = 3 # 设定盘子的数量 hanoi(num_disks, 'A', 'B', 'C') # 执行汉诺塔算法 ``` --- #### 运行过程解析 对于 `num_disks = 3` 的情况,上述程序会按照如下顺序完成操作[^5]: 1. **第一次递归调用** (`hanoi(2, A, C, B)`): - 将顶部两个盘子从 `A` 移动到 `B`,借助 `C` 作为中间过渡。 2. **打印当前动作**: - 输出 `"Move disk 3 from A to C"` 表示最大的盘子被直接从 `A` 移动到了 `C`。 3. **第二次递归调用** (`hanoi(2, B, A, C)`): - 将之前存放在 `B` 上的两个盘子移动到 `C`,借助 `A` 作为中间过渡。 具体输出结果为: ``` Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C ``` --- #### 关键点说明 1. **递归终止条件**: 当只剩下一个盘子时,直接将其从源柱移动到目标柱[^2]。 2. **柱子角色变化**: 在每次递归调用中,三个柱子的角色会发生动态调整。例如,在处理较小规模的问题时,原本的目标柱可能变为新的缓冲柱[^4]。 3. **分治法思想**: 整体问题被分解成更小的子问题,直到达到最简单的情况(即只有一层盘子)[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值