很多同学在开始有意向学习编程的时候,很粗糙的认为学习编程就是学编程语言。以为学会了编程语言的句法、语法就会编程了。
这里有一个很重大的误解,就是简单地把编程语言等同于自然语言了。
大家都有学习外语的经历吧,回头想想,中小学学英语的时候,我们要做的事情不过就是:认字母,背单词,记语法——什么时态、语态、主格、宾格、定语从句、状语从句等等。
每每被动词变形、虚拟语气,和英语阅读时半篇儿不认识的单词搞得七荤八素的时候,就觉得:记住了足够多的单词和语法,自然就会用英语听说读写了。
至于听说读写的内容,我们并不用操心,反正我们每天中文也要说话、阅读、写作,学会了英语,不过就是用哇哩哇啦的发音和曲里拐弯的字母来代替声韵母、方块字做同样的事情罢了。
中文英文(或者任何一种自然语言)最基础的部分都是用来应对日常生活的。我们每个人都对自己的日常生活十分熟悉,对于需要输入(听、读)输出(说、写)的内容早已掌握。而自然语言的形式又特别复杂,所以在学习外语的初中级阶段,大都会将绝大部分精力放在词汇语法上。
但是编程语言这种东西,它的作用不是用来日常聊天或者生活用语的。
虽然不管那种语言第一个程序都是 “Hello World” ,但那是运行环境因为自己能够正常实现功能而对世界发出的欢呼,并不是人与人之间打招呼。
那么多编程语言,无论学其中哪一种,我们都不是为了去问邻居“吃了吗”,跟超市导购讨价还价,或者撩哪个心仪的妹子/汉子……
算法和编程,又是怎样的关系呢? 其实,很简单一句话就能给大家说明白,那就是:
所谓编程,就是实现算法的过程。我们学编程,实际是为了以编程语言为载体来学习算法!
广义而言,做一件事情/解决一个问题的方法,就是算法。
所有的算法都体现为一个过程:这个过程由若干工序(或称为步骤)组成;这些步骤按照一定的流程来加工某些原料;最终产生某种结果。
那么总结一下,算法的几个重点要素就是:
1)目标
2)流程
3)输入(原料)
4)输出(产出)
作为广义算法的一个分支,计算机算法自然也要解决问题或者完成任务,并且也同样具备上述几个要素。
从外面看,一个算法就是一个黑盒。这个黑盒能够解决某一类问题。我们把需要解决的问题作为输入扔到黑盒里面去,里面叮叮哐哐操作一番,过了一段时间之后,从里面倒出来一些输出。这些输出就是对输入对应问题的解答。
体来看算法的要素——计算机算法的流程实则是一个有限的操作序列,具体操作通过计算机指令来实现。计算机算法的输入和输出则都是数据。
那么把上面几点综合起来,计算机算法就是(划重点):
人类要解决的问题无穷无尽,那得有多少种算法呀?
固然人类要解决的问题千奇百怪,在计算机从被发明出来到现在半个多世纪的时间里,其实有一些逻辑层面的基础问题,在大多数应用领域都会用到。许多应用层繁多的花样,最终对应的都是共同的基础问题。
计算机领域的科研人员、开发者,在几十年的工作中,针对一些历史悠久,应用广泛,经常高频出现的问题,研发出了对应的精致、高效的算法。这些算法我们称为经典算法。
计算机的经典算算法也有多种,但其中重要且常用的也相对有限:
掌握了这些,就好像习武掌握了最基本的站桩、马步和套路,其他部分都是为了将“套路”落到实处, 使其可以用来处理现实问题。
我们现在是在学习阶段,应该珍惜时光,尽量在最短的时间内学会能处理计算机世界中最常遇到的问题的算法——也就是最基础的那一批经典算法!