C递归和汉诺塔

递归:

程序调用自身的编程技巧称为递归(百度定义),需注意函数退出的条件。形象例子:从前有座山,山上有个庙,庙里有个老和尚再讲一个故事:从前有座山,山上有座庙,庙里有个老和尚再讲一个故事:从前......

汉诺塔:

假设A塔有64个盘子要全部移到C塔,每次移动一个,且每个塔大的总朝下。

分析:

要将64个盘子移到C塔,则先将上面63个盘子移到B塔,再将第64个移到C塔,再将B塔的63个移到C塔--->

要将63个盘子移到B塔,则先将上面62个盘子移到C塔,再将第63个移到B塔,再将C塔的62个移到B塔--->

要将62个盘子移到C塔,则先将上面61个盘子移到B塔,再将第62个移到C塔,再将B塔的61个移到C塔--->

..............................................................................................................................................................--->

要将3个盘子移到B塔,则先将上面2个盘子移到C塔,再将第3个移到B塔,再将C塔的2个移到B塔--->

要将2个盘子移到C塔,则先将上面1个盘子移到B塔,再将第2个盘子移到C塔,再将B塔的1个移到C塔。

算法:

设有n个盘子在A塔,则从A塔移到C塔的算法为:

1,将n-1个借助C塔移动到B塔

2,将第n个移到C塔

3,将n-1个从B塔借助A塔移动到C塔。

代码:

#include "stdafx.h"

//定义移动步骤的函数

void move(char x,char y);

//定义汉诺塔函数 n为总盘子 a为A塔,b为B塔,c为C塔

void hanoi(int n,char a,char b,char c);

int _tmain(int argc, _TCHAR* argv[])

{printf("input the number of the disks:");

//m为总盘子数

int m;

scanf("%d",&m);

hanoi(m,'A','B','C');

return 0;

}

//n为盘子总数,a,b,c意思为将n个盘子从A塔借助B塔移动到C塔

void hanoi(int n,char a,char b,char c){

if(n == 1)

//一个盘子时直接移

move(a,c);

else

{//将n-1个从A借助C移动到B

hanoi(n-1,a,c,b);

//将第n个移动到C

        move(a,c);

//将n-1个从B借助A移动到C

        hanoi(n-1,b,a,c);}

}

void move(char x,char y){

//移动步骤

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

}

运行结果:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容