void hanoi (int n,char one ,char two,char three)
{
if(n==1) move (one ,three);
else
{
hanoi (n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main()
{
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("the step to moving %3d diskes:\n",m);
hanoi(m,'A','B','C');
}
/*运行情况如下:
input the number of diskes:3 回车
the step to moving 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
书上说hanoi(n-1,one,three,two);是把"one"上的n-1个往"two"上移,接着move(one,three);然后是hanoi(n-1,two,one,three)即把"two"上的n-1个往"three"上移;
|h(2,1,3,2)|h(1,1,2,3)=>move(1,3) <-----1------
| | move(1,2) <-----2------
| |h(1,3,1,2)=>move(3,2) <-----3------
|move(1,3) <-----4------
|
h(3,1,2,3) | |h(1,2,3,1)=>move(2,1) <-----5------
| h(2,2,1,3)|move(2,3) <-----6-------
| |h(1,1,2,3)=>move(1,3) <-----7------
|
*/
注意以上是网上一个网友写的,并不是我写的。诺汉塔最不同的就是它多次调用自己,所以看起来也比较复杂一点。当时我在看这条程序的时候也是看了老半天也看不懂,最好我在网上看到一位朋友说他自己是真的拿了一些碟子自己试着移来看看,后来我也自己试着看,效果真的挺好(我当然没有笨那这么大的碟子啦,用我的光盘写上大、中、小),大家不访也试试看。加上看了上面这个图我也比较清晰了,我要感谢那位网友才行,你们说是吗?这个程序一定要自己慢慢去理解它,祝大家早日理解它吧。递归函数部份我因为不太懂也不能说些什么了,现在来看看函数的另一个内容吧,就是函数的参数调用。我这里先给出一个程序先吧:
int abc(int a,int b)
{
a=a=b; return( a+b );
}
main()
{
int xy[]={3,5};
int s;
s=abc(xy[0],xy[1]);
}
这里的将xy[0]和xy[1]分别传入形参里,这里要说的一点就是和其它高级语言不同的,C语言的函数调用都是单向传递的。限实参传了给形参之后并不会返回到传进来的实参的,所以我们务必记住这点。又如下面一题:
int abc(int a[])
{
int i,j;
/* 排序 */
}
main()
{
int x[5]={3,5,1,2,4}
abc(x);
/* 输出 */
}
这条源程序可为什么会改变实参的数值呢?老潭的书里说的很明白,说是因为这是地址传递,但是我们老师不太认同这点,他说这个也应该是值传递,只不过这个值是比较特殊的一个值,是地址,所以传到形参时可以通过调用这个地址指向的元素而已。如果按老潭的这样说以下这条程序都叫地址传递啦?
int abc(int *p)
{
*p=10;
}
main()
{
int a=20,*w;
w=&a;
abc(w); /*abc(&a)*/
printf("%d",a);
}
指针P也只是一个值而已,这个值是地址。如果说这是地址传递,那不是应该w的地址传给形参吗?剩下来的大家自己想想吧。(这里也不能够说谁对谁错)
接下来说说变量的存储类别,其实这个知识点也挺容易理解的,不过可能给C语言太多的这样的关系弄的糊涂了。C语言里有变量的类型,变量的存储类别,变量的全局性还是局部性,是静态的还是动态的呢。一切都是C语言变量的东西,我们这回也该好好的结束了它。(我们大家一齐看书吧)
很对不起大家,因为今天我的眼有点问题(可能看电脑看太久了)。所以不要再继续和大家进一步讲讲存储类别,这里有一条源程序大家看看吧,我不行了,我要好好休息一下才行了。
int abc(int a)
{
int i,j;
scanf("%d%d",&i,&j);
if(i>j)
{
int k=1,i=2,j=3;
pirntf("%d\n",i*3);
printf("%d\n",j*10);
}
printf("%d",k);
}