汉诺塔的非递归实现及其思考

本文探讨了汉诺塔问题的非递归实现方式,通过手动模拟函数栈来解决这一经典问题。非递归实现利用FILO原理,通过结构体保存状态信息,与递归实现相比,有助于节省系统资源。
摘要由CSDN通过智能技术生成

汉诺塔问题的非递归实现及其思考


有关问题的递归实现和非递归实现其实是我们理解计算机,或者说编程语言中关于函数调用的方式最好的方式之一,它让我们知道了某种编程语言在实现函数调用的方式,也是计算机进程切换的一种思想的体现。

我们先来说说汉诺塔问题:

汉诺塔问题是一个经典的问题。

汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
在这里插入图片描述

递归实现

我们先来看看汉诺塔问题的递归解决思路:

  1. 将 a 上的 n-1 个盘子通过以 c 为辅助移动到 b
  2. 将 a 上剩余的最大的盘子直接移动到 c
  3. 将 b 上的 n-1 个盘子通过 a 为辅助移动到 c

这其实是我们说过无数次的递归思路,代码实现很简单:

// 递归实现汉诺塔
// n 为汉诺塔圆盘编号,从小到大为 1,2,3,……
void hanoi(int n, char A, char B, char C) {
   
    if(n == 1) {
   
        printf("%c -> %c\n", A, C);  // 如果只有一个盘子,从 A 直接移动到 C
    }else {
   
        hanoi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值