c语言用递归实现汉诺塔

Python014

c语言用递归实现汉诺塔,第1张

见代码注释,还有不懂可以问。

#include <stdio.h>

void move(char x,char y)

{

    printf("%c-->%c\n",x,y)

}

//hannuota函数的作用:把n个圆盘从one柱子借助two柱子放到three柱子 

void hannuota(int n,char one,char two,char three)

{

    if(n==1)//如果只有一个柱子 

        move(one,three)//直接移动即可 

    else

    {

        hannuota(n-1,one,three,two)//先把one柱子上的n-1个圆盘借助three柱子移动到柱子two 

        move(one,three)//把第一个柱子的剩下那一个(第n个)移动到第三个柱子

//由于原来one柱子上的n-1个圆盘已经移动到了two柱子上,因此不会有圆盘挡住n圆盘出来 

        hannuota(n-1,two,one,three)

        //最后再把那n-1个圆盘从two柱子借助one柱子移动到three柱子

//(上面第一句话hannuota(n-1,one,three,two)已经移动到了two柱子,因此这里是从two柱子移动到three柱子) 

    }

}

int main()

{

    int m

    printf("input the number of diskes:")

    scanf("%d",&m)

    printf("The step to move %d diskes:\n",m)

    hannuota(m,'A','B','C')

    return 0

}

我一步步的给你讲,就会懂啦:

首先hanoi函数如果把当中的move函数给去掉,就变成了:

void hanoi(int n, char one , char two, charthree)

{

    if(n == 1)

        printf("%c->%c\n", one, three)

    else

    {

        hanoi(n - 1, one, three, two)

        printf("%c->%c\n", one, three)

        hanoi(n - 1, two, one, three)

    }

}

也就是把move(one,three),变成了printf("%c->%c\n", one, three)。少了一个函数,更加清晰

所以这里的hanoi函数就有了执行的内容:printf

下面以3个盘子为例进行模拟计算机的执行过程:

1、hanoi(3,A,B,C),开始了这步,进入第一层函数,计算机在函数中会进行自我的再次调用(第7行代码)

2、(第7行):hanoi(2,A,C,B),于是这又是一个新的hanoi函数,这里我把它成为第二层函数

同样执行到第7行,卡住了,再次一次自我的调用

3、(进入第三层函数):hanoi(1,A,B,C),这里的第三层n=1,所以在第四行就显示出了"A->C",至此,第三层函数结束,回到调用他的第二层函数

4、在第二层当中,继续第8行的内容,所以显示出"A->B",继续运行,到第9行,开始了有一次自我调用

5、把她称为贰号第三层函数吧。。。hanoi(1,B,A,C),和第3步类似,这一层函数显示出了"B->C",然后结束函数,返回调用它的第二层函数

6、第二层函数执行完毕,返回调用它的第一层函数

7、第一层函数中执行到第8行,显示出"A->C",然后执行第9行:hanoi(2,B,A,C)

............

如果看到了这里理清楚了关系就会懂啦,接下来还有一半,如果都写下来就太复杂了-。-

你所说的空函数是指没有返回值,但是这里利用的是电脑调用函数的那种关系来解决的问题,比如上面的3步,会自动返回到第二层函数并继续

还可以这样理解汉诺塔,汉诺塔其实是将复杂的问题简单化,

先不管他有多少个盘子从A到C,我只把它视作3步

就像上面那样找个例子,反复的按照代码模拟计算机运行,过个五次六次,就会懂啦