`
zhoujianghai
  • 浏览: 439162 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

c语言实现汉诺塔(程序执行步骤详解)

阅读更多

很久没去接触c语言了,今天翻了翻c语言的书,偶然间看到了大一时让我郁闷了很久的汉诺塔问题,又重新推理了一遍,汉诺塔的实现采用递归算法,涉及到数据结构中的栈的知识。下面是c实现汉诺塔的源码。程序只是实现了文字信息,即用文字描述了圆盘的移动过程,并未真正实现圆盘的移动,该程序难度并不大,要了解递归的原理和方法中参数值的变化。

# include <stdio.h>

 

void hannuota(int n,char one,char two,char three);
void move(char x,char y);

 

int main(void) {
 int n;
 
 printf("please input a  integer number:");
 scanf("%d",&n);

 

 if(n > 10 || n < 0) {
  printf("请输入一个0~10范围内的整数!!");
  return 0;
 }

 

 hannuota(n,'A','B','C');

 

 return 0;
}

 

void hannuota(int n,char one,char two,char three) {
     if(n == 1) {
       move(one,three);   //<1>
    }
   else {
  hannuota((n-1),one,three,two);    //<2>
  move(one,three);                          //<3>
  hannuota((n-1),two,one,three);   //
<4>
 }


}

void move(char x,char y) {
 printf("%c ----> %c\n",x,y);
}

 

为了避免运行需要很长的时间,程序限制了输入的整数大小为0-10,以下是程序执行的顺序:(为了篇幅,假设n的值是3)

main方法运行到hannuota(n,'A','B','C')时;该方法里的参数为hannuota(3,'A','B','C');

1、第一部分:把A柱中的n-1个圆盘借助C柱移动到B柱

此时执行hannuota方法,因为n=3>1,因此此时递归执行hantuona方法,此时方法参数为hannuota(2,'A','C','B'),(注意此时hannuota方法的参数改变了,C和B值互换);因为n=2>1,继续递归调用hannuota(1,'A','B','C');(此时hannuota方法的参数改变了,C和B值互换);因为n=1,所以执行move方法,打印出A-->C;

返回n=2时程序未执行完的部分,即执行标志为<3>的move方法,因为此时n=1,打印出A-->B,

继续执行标志为<4>的hannuota((n-1),two,one,three)部分,此时参数为hannuota(1,'C','A','B');   此时n=1,打印出C-->B。到此刻位置标志为<2>部分的 hannuota((n-1),one,three,two)程序执行完毕。

2、第二部分:把A柱的第n个圆盘移动到C盘

此时直接执行标注为<3>部分的程序move(one,three); 此时打印出A-->C;

3、第三部分:把B柱上的n-1个圆盘借助A移动到C柱

此时执行标志为<4>部分的hannuota((n-1),two,one,three),此时参数为hannuota(2,'B','A','C');

因为n=2>1,执行标志为<2>的代码,此时方法参数为hannuota(1,'B','C','A');因为此时n=1,执行标志为<1>的代码,打印出B-->A;此时,标志为<2>的程序执行完毕,one,two,three的值分别为one=B,two=A,three=C;

继续执行标志<3>的程序move(one,three); 打印出B-->C; 继续执行至标志<4>的代码hannuota((n-1),two,one,three),参数为hannuota(1'A','B','C'),因此n=1,执行标志<1>的代码,打印出A-->C;

到此为止,程序执行完毕。

程序执行结果如下:

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

 

汉诺塔问题主要分为以上三个部分,程序中用到了递归算法,递归要用到栈的知识,就是进栈和出栈,每到递归调用一个系统的子系统时,都会为子系统分配内存单元,把正被调用的子系统压入栈顶,按照先进后出的规则,执行完后就弹出栈,释放为其分配的内存单元。然后继续执行栈中的其他部分,直到整个程序执行完毕。

 

分享到:
评论

相关推荐

    c语言实现的汉诺塔演示程序.zip

    c语言实现的汉诺塔演示程序c语言实现的汉诺塔演示程序c语言实现的汉诺塔演示程序c语言实现的汉诺塔演示程序c语言实现的汉诺塔演示程序c语言实现的汉诺塔演示程序c语言实现的汉诺塔演示程序c语言实现的汉诺塔演示程序...

    C语言实现的汉诺塔演示程序(附源文件和应用文件)

    本项目中的“C语言实现的汉诺塔演示程序”就是一个使用C语言编写的汉诺塔问题解决方案。它可能包括以下几个方面: 1. **函数定义**:程序通常会包含一个或多个函数,如`hanoi`,用于实现汉诺塔的递归逻辑。这个函数...

    c语言实现汉诺塔

    C语言实现汉诺塔的代码通常采用递归方法。以下是一个简单的C语言程序实现: ```c #include void hanoi(int n, char from_rod, char aux_rod, char to_rod) { if (n &gt;= 1) { // 将n-1个圆盘从'from_rod'移到(aux...

    C语言汉诺塔程序代码

    采用C语言编写汉诺塔,运用递归的方法实现汉诺塔问题。

    汉诺塔问题C语言实现

    汉诺塔问题C语言实现

    C语言编写汉诺塔程序

    总结来说,"C语言编写汉诺塔程序"是一个展示递归算法的经典实例,通过理解并实现这样的程序,我们可以深入学习递归思想,提高逻辑分析能力,这对于计算机科学的学习和发展至关重要。这个压缩包中的“汉诺塔(源码)...

    C语言汉诺塔问题

    用C语言实现汉诺塔(hanoi)递归问题,适于初学者

    C语言实现N阶汉诺塔

    C语言实现汉诺塔,选择要实现的汉诺塔的阶数,程序将显示此阶汉诺塔的解

    C语言汉诺塔hanuo.c

    C语言汉诺塔程序

    数据结构 严蔚敏 C语言版 汉诺塔

    《数据结构 严蔚敏 C语言版 汉诺塔》是计算机科学领域经典的学习资料,其中涵盖了数据结构、算法以及C语言编程的基础知识。严蔚敏教授的教材以其严谨和深入浅出著称,是许多学生和程序员入门数据结构的首选教材。...

    C语言编写的汉诺塔程序

    汉诺塔 c语言编写的汉诺塔程序,C语言初学者必会

    c语言 汉诺塔 算法

    这是个汉诺塔程序,在调试的时候,输入的数字最好不要大于15,因为每大一个数 所得的结果的步骤都会多一倍。如果你有耐心等待结果的话除外。汉诺塔是在欧洲 流行的一种游戏,有a,b,c三个竿。a竿上有若干个由大到小的...

    基于c语言的汉诺塔程序设计与实现

    在C语言中实现汉诺塔问题,主要涉及以下几个知识点: 1. **函数定义**:首先,我们需要定义一个函数来执行汉诺塔的操作。这个函数通常被称为`hanoi`,它接受三个参数,分别代表起始柱、目标柱和辅助柱。 2. **递归...

    c语言汉诺塔代码

    利用c语言编写汉诺塔程序,适用于c语言初学者,对于c语言学习有很大帮助

    c语言实现的汉诺塔演示程序

    c语言实现的汉诺塔演示程序 汉诺塔(Tower of Hanoi),又称河内塔。源自印度古老传说的一个游戏,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把...

    C语言——汉诺塔

    C语言实现汉诺塔、递归。初学者,谢谢

    C语言 汉诺塔小程序 递归算法

    C语言实现汉诺塔时,通常会使用递归函数来表示这些步骤。代码中可能包含一个主函数,负责调用递归函数并初始化参数,以及一个递归函数,实现上述的移动逻辑。递归函数内部的逻辑将根据实际情况进行优化,例如通过...

    汉诺塔 C语言程序汉诺塔 C语言程序.doc

    总的来说,这个C语言程序通过递归实现了汉诺塔问题的解决方案,展示了递归算法在解决复杂问题时的强大能力。递归的关键在于每个子问题都与原问题具有相同的结构,而汉诺塔问题恰好满足这一条件。通过分解问题并不断...

    汉诺塔C语言实现

    ### 汉诺塔C语言实现详解 #### 一、汉诺塔问题背景与规则 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,起源于一个古老的传说。传说中,印度的一个寺庙里有一组梵塔,由三个塔座(A、B、C)组成,其中A座上放...

Global site tag (gtag.js) - Google Analytics