其实就是一直在出栈入栈
1:首先明确程序的流程从整体来看是:"由上到下顺序" 执行的。
2: 举个简单的例子试一下流程:比如2个盘子,然后再去搞些多的;
3: 递归一直都在栈里玩,递归其实最好少用,不单是效率慢,而且很耗费空间。
"比如你输入60个盘子,你基本是要重启电脑了"
只是对于某些问题作用很大,比如树的编历;
///
下面是流程,当然最好以画出流程图。
//======================
A1:
首先:输入n==2;
执行else{}
第一次进入到 hanrota(n-1,A,C,B);==> hanrota(1,A,C,B);
A2:
这时 n==1;
/// 执行//printf("将编号为%d的盘子从%c柱子移到%c柱子\n",n,A,C);
然后执行: reutrn;
pop栈:
这一层执行完毕
A3:
回到n==2(上一层);
继续执行下一行
///printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
执行:hanrota(n-1,B,A,C)=>hanrota(1,B,A,C);
A4:
这时 n==1;
///执行//printf("将编号为%d的盘子从%c柱子移到%c柱子\n",n,A,C);
然后执行: reutrn;
pop栈:
这一层执行完毕
A5:
回到上一层:
n==2;
执行return;
退出涵数,回到main()
程序代码:
# include <stdio.h>
void hanrota(int n,char A,char B,char C)
{
if(1 == n)
{
printf("将编号为%d的盘子从%c柱子移到%c柱子\n",n,A,C);
}
else
{
hanrota(n-1,A,C,B);
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
hanrota(n-1,B,A,C);
}
return;
}
int main()
{
char ch1 ='A';
char ch2 ='B';
char ch3 ='C';
int n;
printf("请输入要移动的盘子个数: ");
scanf_s("%d",&n);
hanrota(n,'A','B','C');
return 0;
}
[
本帖最后由 cosam 于 2011-11-2 10:01 编辑 ]