昨天偶然回顾之前写过的一道题:求1-99阶乘的和。便用了之前所用的方法来完成这道题,因为是演示,所以用1-3阶乘的和更为妥当,如以下所示:
随即我进行了运行,得出的结果却是15,这明显不符合!1+!2+!3的和,和应该是9才对,那么问题到底出在哪里了呢?只有一步一步跟着程序走才能知道自己错在哪里了。进入循环,n等于1,同时也小于等于3,满足条件进入内部循环,得:
i=1,故n=1=i,ret=ret*i=1*1=1;sum=sum+ret=0+1=1
然后i++为2,2>n=1不符合条件,进入下一次循环n++为2,n=2<=3成立,进入内部循环,得: i=1,ret=ret*i=1*1=1;i=2,ret=ret*i=1*2=2;sum=sum+ret=1+2=3
然后i++为3,3>n=2不符合条件,进入下一次循环n++为3,n=3<=3成立,进入内部循环,得:
i=1,ret=ret*i=2*1=2;i=2,ret=ret*i=2*2=4;i=3,ret=ret*i=4*3=12
sum=sum+ret=3+12=15
所以最后打印出来是15,那么问题出在哪呢?问题就出在ret上,每一次循环中ret运用的都是上一次循环中ret的值,没有将其再次赋值为1,这导致了每一次ret=ret*i计算的数都在叠加,故也影响到后面sum=sun+ret的计算,最终运行错误。
那正确的代码应该是怎样的呢?哪颗螺丝松了就拧紧哪颗螺丝,将ret再次赋值为1的语句加上就行了,如图所示:
结果为9,运行正确。
然而在今日的C语言课上,我学习到了更加精确简便的代码来完成这到题,它既不需要将ret重新赋值,也不需要二次循环,此代码如图所示:
由此运行就不用将ret重新赋值为1。运行结果也为9,而且更为精简正确。
心得:编写代码是严谨的,也是有活力的。只是会写代码并不能代表什么,而是要比别人更精更简更会变通更有逻辑更有效率才更有核心竞争力。我的计算机之路任重而道远!