精华内容
下载资源
问答
  • 基于C语言用递归算法实现汉诺塔解法的计算 如有不懂欢迎提问 #include<stdio.h> int steps = 0; //三根柱A(用0表示),B(用1表示),C(用2表示),起始A,目标C void print(int num, int get, int put) { ...

    基于C语言用递归算法实现汉诺塔解法的计算
    如有不懂欢迎提问

    #include<stdio.h>
    
    int steps = 0;
    
    //三根柱A(用0表示),B(用1表示),C(用2表示),起始A,目标C
    
    void print(int num, int get, int put) {
    	steps++;
    	printf("move disk%3d from %c to %c\n", num, get == 0 ? 'A' : get == 1 ? 'B' : 'C', put == 0 ? 'A' : put == 1 ? 'B' : 'C');
    }
    void mv(int num,int a,int b,int c) {
    	if (num == 1)
    		print(1, a, c);
    	else {
    		mv(num - 1, a, c, b);
    		print(num, a, c);
    		mv(num - 1, b, a, c);
    	}
    }
    int main() {
    	int n;
    	printf("Input the number of disks:");
    	scanf("%d", &n);
    	printf("The setps to moving %3d disks:\n",n);
    	mv(n, 0, 1, 2);
    	printf("Complelt in %d steps!\n",steps);
    	return 0;
    }
    

    在这里插入图片描述

    交流讨论等具体内容请访问我的博客

    原文地址:https://boyinthesun.cn/post/c-hanoi/

    展开全文
  • c语言实现递归汉诺塔

    2008-10-22 13:31:30
    用递归算法实现汉诺塔。即用递归算法来实现小盘子的移动
  • C语言解决汉诺塔问题《经典》 首先要知道汉诺塔是怎么一个...这里有用到函数,函数递归实现汉诺塔问题。 代码实现如下: // hanoi.cpp : Defines the entry point for the console application. // #include &l

    C语言解决汉诺塔问题《经典》

    首先要知道汉诺塔是怎么一个问题
    例如A 、B、 C 三个柱子,A柱子上假如放有三个盘子,最上边是最小的,最下边是最大的盘子;现在想让A柱子借助B柱子将三个盘子移入到C柱子上,《且每次只能移动一个盘子,而且要最后在C柱子上的盘子按从大到小依次堆起来》;这里有用到函数,用函数递归实现了汉诺塔问题。
    代码实现如下:

    // hanoi.cpp : Defines the entry point for the console application.
    //
    
    #include <stdio.h>
    #include "stdafx.h"
    
    void hanoi(int n, char A, char B, char C)  //n代表盘子数
    {
    	if(n==1)
    		printf("%c--->%c\n",A, C);
    	else
    	{
    		hanoi(n-1, A, C, B);  //A绕过C去到B上
    		printf("%c--->%c\n", A, C);
    		hanoi(n-1, B, A, C);
    	}
    }
    int main(int argc, char* argv[])
    {
    	hanoi(3, 'A', 'B', 'C');
    	return 0;
    }
    
    

    例如代码所示,如果是三个盘子,移动到C柱子上的步骤为:
    在这里插入图片描述
    不管几个盘子,这个代码都可以实现。只需要改变“hanoi(3, ‘A’, ‘B’, ‘C’);”里的3数字即可

    展开全文
  • 用C语言实现汉诺塔自动递归演示程序 程序实现效果 1.变界面大小依照输入递归数改变。 2.汉诺塔自动移动演示。 3.采用gotoxy实现流畅刷新。 4.保留文字显示递归流程 程序展示及实现 github地址:...

    用C语言实现汉诺塔自动递归演示程序

    程序实现效果

    1.变界面大小依照输入递归数改变。

    2.汉诺塔自动移动演示。

    3.采用gotoxy实现流畅刷新。

    4.保留文字显示递归流程

    程序展示及实现

    代码博客链接

    github地址:https://github.com/404name/C-game
    

    在这里插入图片描述

    0.主体思路

    输入要递归的汉诺塔数目,在原来的汉诺塔基础上新增move_play函数展示递归,用next数组存储每种移动状态。对应的从哪到哪可自动对应相应的移动方式自动移动。

    1.变界面大小依照输入递归数改变

    init函数按比例放大并且打印出图形界面。

    2.汉诺塔自动移动演示。

    int next[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; //上0 下1 左2 右3;
    int turn[2][3] = {{0, 3, 1},                         //a -> b   b -> c a -> c  上右下
                      {0, 2, 1}};                        //b -> a  c -> b  c -> a    上左下
    

    next是移动方向,turn储存多种移动方向。

    例如后台读取到是 b -> c 则读取flag为 0对饮 turn【flag】的上右下

    然后依次把turn的3个值带入next实现先上当达到我设定的上界后改变第二次状态,向右达到右边设定的界限后向下移动到指定地方,结束一次移动。

    3.采用gotoxy实现流畅刷新。

    一开始我一直都是用cls清屏再打印,但这样刷屏很严重,后来甚至把gotoxy也一样用,后来我师傅,一位学长给我指点了下,我才发现,gotoxy是可以直接在已有图形上当作画笔一样改变,这样就实现了十分顺滑的运行。

    4.保留文字显示递归流程

    在屏幕下方同样用gotoxy移动到指定位置打印最基础的移动信息。

    总结

    这个程序是我觉得写的很巧妙的一个,本来一开始学汉诺塔时就想着为什么不能演示出来呢?但随着想象和现实相差太远,那时候我发现想很简单,但想出个框架与实现思路很难,怎么表示汉诺塔大小和如何让他自动移动是个很大的问题,后来学习了一些螺旋打印后就想到了用next去实现让他移动再加个数组存储他的移动方式,果然还是实现了。

    展开全文
  • 用递归与非递归方法实现汉诺塔问题,C语言实现

    如题,直接上代码,注释写的很全了
    非递归还是用栈实现

    /*包含头文件*/
    #include <stdio.h>
    #define MAXSIZE 60
    /*函数声明*/
    void Hanoi1(int n, char a, char b, char c);
    void Hanoi2(int n, char a, char b, char c);
    void PrintHanoi(int no, char from, char to);
    
    typedef struct
    {
        char a,b,c;
        int flag,num;
    }stack;
    
    int main()
    {
        int n;
        printf("请输入移动圆盘的个数:\n");
        scanf("%d",&n);
        printf("汉诺塔的递归实现:\n");
        Hanoi1(n,'a','b','c');
        printf("汉诺塔的非递归实现:\n");
        Hanoi2(n,'a','b','c');
        return 0;
    }
    
    void PrintHanoi(int no, char from, char to)//输出汉诺塔的圆盘移动过程
    {
        printf("将第%d个圆盘从%c移动到%c\n",no,from,to);
    }
    
    void Hanoi1(int n, char a, char b, char c)
    {
        if (n==1) PrintHanoi(n,a,c);
        else
        {
            Hanoi1(n-1,a,c,b);
            PrintHanoi(n,a,c);
            Hanoi1(n-1,b,a,c);
        }
    }
    
    void Hanoi2(int n, char a, char b, char c)
    {
        int top=1,a1,b1,c1,m;
        stack s[MAXSIZE];
        //初值入栈
        s[top].num=n;
        s[top].flag=1;
        s[top].a=a;
        s[top].b=b;
        s[top].c=c;
        while(top>0)
        {
            if (s[top].flag==1)
            {
                //退栈hanoi(n,a,b,c),相当于在递归函数中将实参传给形参
                m=s[top].num;
                a1=s[top].a;
                b1=s[top].b;
                c1=s[top].c;
                top--;
                /*将hanoi(n-1,a,b,c)入栈,相当于在递归函数中的第一个递归调用函数,
                  将编号为1~n-1的圆盘从塔座a移动到b,c作为辅助塔座*/
                top++;
                s[top].num=m-1;
                s[top].flag=1;
                s[top].a=b1;
                s[top].b=a1;
                s[top].c=c1;
                //将第n个圆盘从a移动到c
                top++;
                s[top].num=m;
                s[top].flag=0;
                s[top].a=a1;
                s[top].c=c1;
                /*将hanoi(n-1,b,a,c)入栈,相当于在递归函数中的第一个递归调用函数,
                  将编号为1~n-1的圆盘从塔座b移动到c,a作为辅助塔座*/
                top++;
                s[top].num=m-1;
                s[top].flag=1;
                s[top].a=a1;
                s[top].b=c1;
                s[top].c=b1;
            }
            while(top>0&&(s[top].flag==0||s[top].num==1))
            {
                if(top>0)//将第n个圆盘从a移动到c,并退栈
                {
                    PrintHanoi(s[top].num,s[top].a,s[top].c);
                    top--;
                }
            }
        }
    }
    
    
    展开全文
  • 个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考。记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果。今天...
  • C语言用栈与递归模拟汉诺塔

    千次阅读 2018-01-27 15:43:23
    题目:X有n个盘子,从上到下有从小到大的顺序,有三个柱子X,Y, Z,把n个盘子...hannota函数递归实现; move函数为移动盘子操作;   二)结果与代码   #include &lt;stdio.h&gt; #include &lt...
  • 汉诺塔问题 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 6464 片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按...
  • 对于汉诺塔题目,最好的是运用递归方法实现汉诺塔的移动。 给出代码: #include<stdio.h> int count=0; //定义一个全局变量count计数 ,方便后面打印移动的次数 void Move(char a,char b) //移动函数 ...
  • 汉诺塔问题目标:把A上的‘盘子’全部移动到C上,每次只能移动一个,而且移动过程中小‘盘子’只能在大‘盘子’上面。 要用递归解决该问题就需要找到f(n)f(n)f(n)与f(n−1)f(n-1)f(n−1)的关系 f(n)f(n)f(n)即将n个...
  • 汉诺塔递归实现 C语言

    千次阅读 多人点赞 2019-11-01 00:10:51
    汉诺塔递归实现 C语言版 我上一篇博客是汉诺塔C语言递归实现,非递归和递归想法一样。这里不再赘述,直接链接转到: 汉诺塔递归实现 C语言递归实现固然好理解,但是n的值越大,空间和时间上都是极大的消耗,...
  •   汉诺塔源自印度传说,由于其鲜明的递归性也是介绍递归算法的经典例子,本文主要介绍用C语言实现汉诺塔算法。因为在了解了汉诺塔传说后的好奇我也对进行了计时测试,结果暂且不表。 一、汉诺塔传说   了解...
  • 一个用递归实现汉诺塔代码,简单明了,易于理解
  • 汉诺塔的移动是用递归实现的,要理解汉诺塔,必须对递归有一个清晰的认识。不过要理解汉诺塔也并不需要搞懂递归的底层实现之类的,明白怎么工作就可以了,并不需要知道这是怎么实现的。  把盘子的移动看成三个环节...
  • 看谭老师著名的C语言教材一直没有搞懂汉诺塔递归原理, 偶尔看到一本c++教材上讲解的比较详细,就python写了一个解法,总共5行代码,还是挺简单的。写的时间比较久远了,等我找到那本书,再把书中的解析附上。 ...
  • 数据结构(c语言汉诺塔(Hanno)递归实现 一、 汉诺塔(Hanno) 汉诺塔汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序...
  • 用C语言实现汉诺塔的程序

    千次阅读 2006-03-05 14:35:00
    /*本程序是模拟汉诺塔的操作过程,将每一步的执行方法打印出来,并记录执行次数;主程序采用递归方式;每执行一步等待0.5秒;*/#include#include /*for the function: clrscr()*/#include /*for the function: ...
  • 递归汉诺塔

    2018-05-28 10:08:12
    用C语言实现。#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void hannuota(int n,char A,char B,char C); void hannuota(int n,char A,char B,char C){ /* 如果是一个盘子,直接将盘子...
  • 递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。 输入格式: 输入为一个正...
  • 用C语言实现汉诺塔递归算法,另外还有用栈来实现的方式:http://download.csdn.net/detail/jason19905/6419427
  • 程序介绍: 【C语言用C语言实现汉诺塔自动递归演示程序 /*------------------------------------ project : 汉诺塔演示软件; language: C语言 author: 404name 叠64层需要开全窗口并且将字号调整为6 -------...
  • 栈来实现汉诺塔,要明白递归就是栈的重要应用之一,递归是系统自动调用栈来处理。
  • 汉诺塔由三根柱子(分别数字 1、2、3 表示)和n个大小互不相同的盘子组成。 一开始n个盘子都摞在柱子1上,大的在下面,小的在上面,形成了一个塔状的锥形体。 对汉诺塔的一次合法的操作是指:每次只能移动一个盘子...

空空如也

空空如也

1 2 3 4 5
收藏数 96
精华内容 38
关键字:

c语言用递归实现汉诺塔

c语言 订阅