编程届有两大公认难题:算法原理

有些东西,你问知不知道?知道,会不会用?会,但如果再深问,涉及到更细节的“实现原理”,就会难倒一大波人。

很多人早已习惯了这种现象,甚至觉得自己不够聪明,选择放弃。

那么就有两个问题摆在面前:

  • 真的躲得过去吗?
  • 只有编程才需要探索原理?

我目前所在公司是做教育,数学教育是重中之重,前两天刚好做了这么一个培训——“根源教学法”。

什么是“根源教学法”?——把难题变简单,从本质上解决问题。

懂一个概念,搞定一类题,学透一个方法,搞定多类题,学透基本思想,难题变简单题。

举了几个很典型的例子,拿一个跟大家分享:

一条线,在两端及中间共加6个点,可以找出几条线段?

乍一看,不难,也没那么简单,几条呢,数呗,1、2、3、4…

可行,但有点傻,还可能数着数着就漏了,或者重复了。退一步讲,没数错,但6个点可以这么数,10个点,20个点呢?你要知道,数学问题如果是按照倍数或指数级增长的话,把人累死也解决不了。

有规律可寻么?很多老师会用“口诀法”教学生:点乘段除以2。即拿点的数量和段的数量相乘,再除以2。

按照这个口诀,例子中是6个点,5个段,结果是(6*5)/2 = 15

不得不说,很聪明,效率很高。“口诀法”就是简单粗暴,爽。

但是,为什么可以这么算?巧合吗?依据是什么?

我们简单剖析一下,总共6个点,从中挑一个点出来,往另外5个点连线,就是5条,那么6个点轮流操作一遍,就是6个5,假设一个点a,一个点b,从线段的角度,ab和ba是同一条线,所以,算出来的总数是实际数量的两倍,再除以2,就是最终结果。

这样以来,是不是既记住了快速解题的方法,又明白了为什么这样做。

那么,说好的解决一类题呢,当然可以。比如:

  • 10个人,每两个人互握一次手,共握几次手
  • 10个人,每人给其他人各发一个红包,共发几个红包
  • 一个圆周上有N个点,它们相互之间可以连接出多少条线

同类问题有很多,它们的区别仅在于,正反向操作是否等效。


所以,不仅编程要懂原理,各个领域都有自己的研究内容和原理。

原理是什么,按照字面意思解释——得出方法的原因和道理

懂原理的好处大概这么几点:

  • 同类问题知道怎么解
  • 知道一个方法的优劣势
  • 能够创造新方法,或者改造旧方法

并不是说到“原理”就一定难,它只是需要我们多想一步,问个为什么,研究多了会发现还是很有趣的。