代码升级方案

通常情况下的功能实现(这是最基础的)

边界性(尽可能考虑周全,把所有情况都涵盖到。如果在上一步实现功能的基础上能进阶到这一步,就已经跨越了相当大的阻碍,后面的进阶跨度就没有这一步这么大了,会轻松很多)

健壮性(用户任何的无厘头输入都有应对方案)

可读性(代码交接给任何人,都能比较轻易被读懂)

复用性(尽可能精简代码,这一点跟上面的可读性会有冲突,两者权衡时,以可读性为优先选项)

 

关于鸡兔同笼问题,我一开始自己用两层for循环写出来来,然后在百度上发现用一层for循环也能写出来,这样时间复杂度就从O(n**2)降低为O(n)了。

解决问题的时候,有数学方法和编程方法,如果能把一个问题先用数学方法找到解决方案,再把数学转换成编程,那么编程就会变得很简单,而且逻辑更顺畅。但有的时候你要把一个问题的数学解法推导出来的话,有的时候会导致问题过于复杂化,因为数学的逻辑太繁复太耗时,这个时候用编程模拟会更高效,而且时间成本会更低。关于解决问题的方法,数学方法只能解决这一个问题,而编程则是解决一类问题,范围上就有很明显的差距了。所以我们对于具体的情况,综合考量,如果这个问题不是多严重的问题,严重到我们要详细地考量它的时间复杂度和内存占用,锱铢必较地扣细节,那么数学会派上用场,当然了耗时会更高,如果它不惜耗时也要达到那样的要求的话。如非如此,用编程能快速地给出解决方案,即便复杂度会高一些,就像下面的鸡兔同笼问题,O(1)和O(n)的复杂度几乎在这个问题中是没有差异的,那就不必劳神费力去用lambda解决它,但是若你有这样的数学思维方式,看到类似的问题能迅速反应出来,那时间成本和编程几乎是持平的,用数学更高级,你就用数学,装逼一下,也很可爱。

 

上面的那个鸡兔同笼问题,有35个头,94只脚,问这个笼中有几只兔和鸡。数学里面有一元一次方程解,还有二元一次方程解。对应的有一层循环和两层循环的编程思想。

但是还有一种可以把时间复杂度降为O(1)的编程方法,也是通过数学转换过来的。而且用到的是初中的数学知识。

把公式列出来之后,最后用lambda表达式,即可求出解法。没错,一句话函数,两个参数,两个返回值。

具体数学公式和编程代码在我的GitHub上,地址请戳 

 

posted @ 2018-11-05 11:35  dream-子皿  阅读(460)  评论(0编辑  收藏  举报