文章目录

  • c语言简化版
  • C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库)
    • main.c
    • sequential_stack.cpp
    • sequential_stack.h
    • 运行结果

找了个汉诺塔游戏玩,一开始玩给我整懵逼了,后来玩着玩着才慢慢找到诀窍,但到了高阶(> = 7)的时候,老是记不住步骤,果然普通人的脑袋对于递归这种层层递进式线索较长的运算结构,还是不具备优势啊!就好比由一个问题衍生出另一个问题,只有解决了后面的问题才能解决前面的问题,但当问题一个接着一个衍生到七八个问题的时候,最初的问题是啥都给忘得一干二净了!

但是计算机不会,它会把一个一个问题存放在函数调用栈中,就算是后面衍生出几百上千个问题,它也不可能忘记!

下面用我们用代码来实现它,有python和c语言两个版本:

c语言简化版

输入的是当前I塔的层数n

#include <stdio.h>void hanoi(int n, char I, char J, char K) {//printf("n = %d\n", n);if (n == 1) {printf("%c -> %c\n", I, K);}else {hanoi(n-1, I, K, J);printf("%c -> %c\n", I, K);hanoi(n-1, J,I,K);}
}int main() {hanoi(3, 'A', 'B', 'C');return 0;
}

运行结果:

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

C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库)

main.c

#include <stdio.h>
#include "sequential_stack.h"struct SqStack A = { 'A' };
struct SqStack B = { 'B' };
struct SqStack C = { 'C' };void print_hanoi_tower() {StackTraverse_R(A);StackTraverse_R(B);StackTraverse_R(C);printf("\n");
}void hanoi(int n, struct SqStack* I , struct SqStack* J, struct SqStack* K) {if (n == 1) {printf("%c -> %c\n", I->name, K->name);int e;Pop(I, &e);Push(K, e);print_hanoi_tower();printf("\n");}else {hanoi(n-1, I, K, J);printf("%c -> %c\n", I->name, K->name);int e;Pop(I, &e);Push(K, e);print_hanoi_tower();printf("\n");hanoi(n-1, J, I, K);}
}int main() {InitStack(&A);InitStack(&B);InitStack(&C);//汉诺塔阶数int tower_floor = 4;for (int i = tower_floor; i > 0; i--)Push(&A, i);printf("%d阶汉诺塔:\n", tower_floor);print_hanoi_tower();printf("\n");int len = StackLength(A);hanoi(len, &A, &B, &C);return 0;
}

sequential_stack.cpp

//顺序栈:泛型版,里面存指针
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"
#include "sequential_stack.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */int visit(int c)
{printf("%d ", c);return OK;
}/*  构造一个空栈S */
int InitStack(struct SqStack* S)
{/* S.data=(int *)malloc(MAXSIZE*sizeof(int)); */S->top = -1;return OK;
}/* 把S置为空栈 */
int ClearStack(struct SqStack* S)
{S->top = -1;return OK;
}/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
int StackEmpty(struct SqStack S)
{if (S.top == -1)return TRUE;elsereturn FALSE;
}/* 返回S的元素个数,即栈的长度 */
int StackLength(struct SqStack S)
{return S.top + 1;
}/* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
int GetTop(struct SqStack S, int* e)
{if (S.top == -1)return ERROR;else*e = S.data[S.top];return OK;
}/* 插入元素e为新的栈顶元素 */
int Push(struct SqStack* S, int e)
{if (S->top == MAXSIZE - 1) /* 栈满 */{return ERROR;}S->top++;              /* 栈顶指针增加一 */S->data[S->top] = e;  /* 将新插入元素赋值给栈顶空间 */return OK;
}/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
int Pop(struct SqStack* S, int* e)
{if (S->top == -1)return ERROR;*e = S->data[S->top];    /* 将要删除的栈顶元素赋值给e */S->top--;             /* 栈顶指针减一 */return OK;
}/* 从栈底到栈顶依次对栈中每个元素显示 */
int StackTraverse(struct SqStack S)
{int i;i = 0;while (i <= S.top){visit(S.data[i++]);}//printf("\n");return OK;
}/* 从栈顶到栈底依次对栈中每个元素显示 */
int StackTraverse_R(struct SqStack S)
{printf("%c:", S.name);int i;i = S.top;while (i > -1){visit(S.data[i--]);}printf("\t");return OK;
}

sequential_stack.h

#pragma once
#define MAXSIZE 20/* 顺序栈结构 */
struct SqStack
{char name;int data[MAXSIZE];int top; /* 用于栈顶指针 */
};extern int visit(int c);
extern int InitStack(struct SqStack* S);
extern int ClearStack(struct SqStack* S);
extern int StackEmpty(struct SqStack S);
extern int StackLength(struct SqStack S);
extern int GetTop(struct SqStack S, int* e);
extern int Push(struct SqStack* S, int e);
extern int Pop(struct SqStack* S, int* e);
extern int StackTraverse_R(struct SqStack S);

运行结果

4阶汉诺塔:
A:1 2 3 4       B:      C:A -> B
A:2 3 4         B:1     C:A -> C
A:3 4   B:1     C:2B -> C
A:3 4   B:      C:1 2A -> B
A:4     B:3     C:1 2C -> A
A:1 4   B:3     C:2C -> B
A:1 4   B:2 3   C:A -> B
A:4     B:1 2 3         C:A -> C
A:      B:1 2 3         C:4B -> C
A:      B:2 3   C:1 4B -> A
A:2     B:3     C:1 4C -> A
A:1 2   B:3     C:4B -> C
A:1 2   B:      C:3 4A -> B
A:2     B:1     C:3 4A -> C
A:      B:1     C:2 3 4B -> C
A:      B:      C:1 2 3 4

参考文章:「递归练习」汉诺塔

汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)相关推荐

  1. 汉诺塔问题详解 递归实现 C语言

    目录 一.前言 二.游戏规则 三.思路讲解 四.完整代码 五.最终结果展示 一.前言 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,  其中一根柱子 ...

  2. java实现求解汉诺塔问题(提示, 使用递归)

    实现代码: 求解汉诺塔问题(提示, 使用递归) 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从 ...

  3. 奇怪的汉诺塔 Four Column Hanoi Tower

    奇怪的汉诺塔 题面 传送门 思路 首先考虑三个柱子的汉诺塔: 假设当前有 n n n个盘子: 先把前n-1个盘子从A柱移到B柱,然后把A柱上剩的那一个盘子移动到C柱最后把B柱上的那n-1个盘子移动到C ...

  4. 经典汉诺塔(Java初学递归篇)

    大一学C的时候已经接触到汉诺塔递归的问题,当时只是简单了解过方法,最近开了算法课,打算重新捋一捋. 题目描述:         有三根柱子分别为A.B.C,柱子A上从下到上按金字塔状叠放着n个不同大小 ...

  5. 用java编写汉诺塔问题_数据结构与算法之汉诺塔问题(Java递归)

    汉诺塔问题: 有三根柱子,源杆A,暂存杆temp,目的杆C A上有n层盘子,由小到大向下排列,现需要将A杆的盘子移到C杆中 要求:1)大的盘在下面,小的盘在上面 2)一次只能移动一个盘子 个人思路:先 ...

  6. c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)

    问题概述:古代有一个梵塔,塔内有3个座A,B,C.开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上,有一个老和尚想把64个盘子从A座移动到C座,但是规定每次只允许移动一个盘,且在移动过程中在 ...

  7. 汉诺塔问题(Hanoi)

    汉诺塔问题,是心理学实验研究常用的任务之一.该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A.辅助柱B及目标柱C. 相传在古印度圣庙中,有一种被称为汉诺塔(Ha ...

  8. 个盘子的汉诺塔需要移动几步_图解汉诺塔问题( Java 递归实现)

    汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题--汉诺塔问题. 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候 ...

  9. 从 最具启发性的汉诺塔问题开始 聊递归

    文章目录 一.最具启发性的汉诺塔问题 1.汉诺塔问题描述 2.从最初开始 3.优化 二.打印一个字符串的全部子序列 1.子序列定义 2.代码 三.打印一个字符串的全部子序列,没有重复值 四.打印一个字 ...

  10. 由汉诺塔引起的对递归的思考

    对递归的理解在于放弃,放弃对于全程的理解与跟踪,只理解递归两层之间相互的联系,以及递归终结的条件. 汉诺塔永远只有两层,最底层和上层,上层放到中间,底层放好,再把中间的放到底层上面!!! 就这样,在乱 ...

最新文章

  1. 335b装配程序流程图_某建设项目装配式框架结构PC构件吊装监理细则(方案)
  2. 不能ssh连接ubuntu linux 服务器 secureCRT不能ssh连接服务器 不能远程ssh连接虚拟机的ubuntu linux...
  3. 高大上的Android沉浸式状态栏?
  4. 在swt中获取jar包中的文件 uri is not hierarchical
  5. [bmgr]android应用数据备份以及还原
  6. leetcode 403. 青蛙过河(dp)
  7. leetcode230. 二叉搜索树中第K小的元素(中序遍历)
  8. Python 数据分析三剑客之 NumPy(三):数组的迭代与位运算
  9. 现代软件工程 作业 个人项目
  10. python及pycharm
  11. python伪代码书写规范_代码这样写更优雅(Python 版)(转载)
  12. 云服务器 ECS 搭建WordPress网站:备案
  13. 多家大厂的存储设备受第三方加密软件缺陷影响
  14. MyBatis 3.5.1 发布,Java 数据持久层框架
  15. DOM之事件高级(附实例、图解)
  16. python类的简单例子
  17. PLC控制电机正反转原理图
  18. 连接网络打印机报0x00000709解决方案
  19. 拆书帮第14期训练营——作业九:如何通过刻意练习来掌握临界知识
  20. 树状数组————(神奇的区间操作)蒟蒻都可以看懂,因为博主就是个蒟蒻...

热门文章

  1. 实习总结之jquery实例
  2. 菜鸟也玩WebMatrix
  3. 【学习笔记】12、标准数据类型—列表
  4. 【温故知新】CSS学习笔记(开发者工具介绍)
  5. PP生产订单的BADI增强 WORKORDER_UPDATE
  6. SAP成本会计分录大全
  7. SAP产品概念及版本简介
  8. 在账户确定类型KOFI没有找到总账科目
  9. 飞鹤、蒙牛、伊利、澳优、合生元、贝因美,谁是未来国产奶粉的扛把子?
  10. 消费金融大潮来了,银行必须打出这套进攻+防守的组合拳