如果有我的同学也看到这篇文章大概会感到惊讶和好笑了,因为这是大一上就做过的一道题。
当时刚学了递归,最简单的一道题就是求n!这个用递归我会做,但是汉诺塔一下子就吓懵了。
我当时的想法是,把n-1块先挪到B上去,然后把第n块挪到C上去,然后把n-1块挪到C上去就大功告成了,在挪n-1时就应该用到的是递归。但是当时死读书,看书里的递归问题范例都是这样的
int f(int n){
if(n==1)
return 1;
else
return n*f(n-1);
}
所以以为递归都必须是
else
return n*f(n-1);这种形式的,没敢想着“递归”真实的含义就是,自己调用自己,而误以为都是自己返回自己,这里的区别是自己返回自己的话,返回后面的代码根本不会被运行,这样就没办法再重新按照刚才的步骤走一遍,所以当时死脑筋没做出来。昨天突然想到这个没解决的问题,刚刚做了才发现,原来是我想的实在太复杂了。
写这篇博客的时候,我特别开心,因为我一直特别讨厌计算机专业,当初也并不想来这个专业,我想去的是医学院,所以在这里学的很痛苦,甚至快得了抑郁症,每天失眠,害怕进实验室,害怕见到同专业同学,因为他们太优秀,害怕TA,因为他们的关心给了我很大压力。但是没办法,除非退学。最后休学一学期硬着头皮重新学了一年,终于是慢慢的开始对计算机感兴趣一丢丢了~渐渐的,发现原来一个问题有那么多解法,原来翻个外网这么简单,原来人工智能和心理学还有关~诸如此类颇多,虽然我还是班里最差的一批人,但是我一直在努力,一直在进步。今天把汉诺塔做出来之后,我才发现,原来之前一直是自己在吓唬自己,一看到题目就害怕根本不是题目太难,而是我没有“真正”地去面对过,每天哭丧着脸说我不行,因为我不喜欢,给自己找了那么多借口。现在我一定要继续加油,也许哪一天,我可以骄傲地对着计算机说嘿,我的男朋友你好啊。
按照下面这样的做法就很轻松做出来了。
#include
void putWay(int n,char A,char B,char C){
if(n==1)
printf("%c->%c\n",A,C);
else{
putWay(n-1,A,C,B);
printf("%c->%c\n",A,C);
putWay(n-1,B,A,C);
}
}
int main()
{
int n;
scanf("%d",&n);
putWay(n,'A','B','C');
return 0;
}
我要做一个优秀的程序媛,加油!