递归:
程序调用自身的编程技巧称为递归(百度定义),需注意函数退出的条件。形象例子:从前有座山,山上有个庙,庙里有个老和尚再讲一个故事:从前有座山,山上有座庙,庙里有个老和尚再讲一个故事:从前......
汉诺塔:
假设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);
}