什么是算法？
在计算机科学中，
算法是一系列的指令，
用来一步一步地解决问题。
通常，算法由计算机执行，
但是我们人类同样可以用算法。
例如，你会怎么去数
一个房间中的人数？
好吧，如果你像我一样，
你可能会去数每一个人，
一次数一个，
从0开始：
1, 2, 3, 4...
那么这就是算法。
事实上，让我们尝试这样去表达它，
用有点儿更正式的伪代码，
像英文的句法
类似于编程语言。
设n等于0。
对于房间中的每个人，让n=n+1。
如何来理解这些伪代码呢？
好吧，第一行，可以这么说，它声明了
变量n
并且将它初始化为零。
这仅表示我们的算法在开始时
我们计算的对象
的值为零。
毕竟，在我们开始数之前，
我们没有计数任何对象。
将这个变量称为n只是一个惯例。
我几乎可任意称它。
在第二行中，标志了循环的开始，
这里将重复执行一系列的步骤，
所以在我们的例子中我们所说的步骤
是数房间中的人数。
接着第二行的是第三行，
它描述了我们究竟怎样去计数。
行首缩进表明这是第三行
这个过程会重复执行。
那么，再来看看伪代码表达了什么，
在从零开始后，
对于房间中的每一个人，
我们给n加1。
那么，这种算法正确吗？
我们继续来讨论这个话题。
如果房间中有两个人，这个算法有效吗？
我们来看一看。
在第一行，我们初始化n为零。
对于两人中的每一个人，
我们把n增加1。
所以在第一次循环时，
我们将n的值从零更新为1，
在第二次循环时，
我们将n的值由1更新为2。
在这个算法结束时，n的值是2，
可以看到，n的值确实等于房间中人数。
到目前为止，一切都好。
那么考虑另一种极端情况下算法会怎样？
除了计数的我以外，
房间里没有其他任何人。
在第一行中，我们仍然将n初始化为零。
然而，这一次，第三行根本不执行
因为房间中没有其他人，
所以，n仍然为零，
同样等于房间中的人数，
是不是很简单？
但是，每次只数一个人是不是也很没效率？
当然，我们可以做得更好！
为何一次不连数两个人？
区别于1，2，3，4，5，6，7，8这样去数
为何不
2,4,6,8...这样呢？
它甚至听起来比之前的方法更快，它肯定是。
让我们把这个优化过程用伪代码的形式表示出来。
设n等于零。
对于房间中的每一对人，
设n=n+2。
很简单地改动，是吗？
不是一次数一个人，
我们一次数两个人。
所以这个算法比之前的算法快了两倍。
但是它正确么？
让我们来看看。
假设房间中有两个人时算法正常工作吗？
在第一行中，我们把n初始化为零。
对于这一对人，我们把n增加2。
所以，当算法结束时，n的值是2，
它正好等于房间中的人数。
进一步假设房间中人数是0。
在第一行中，我们把n初始化为零。
像之前一样，第三行根本不执行，
因为房间中没有成对的人，
所以，n仍为零，
这也同样符合房间中的人数。
但要是房间中有三个人时情况会怎样呢？
这个算法会怎么公平处理？
让我们来看一看。
这三人中的两人组成一对
在第一行中，我们把n初始化为0，
我们把n增加2，
但是然后情况如何？
房间里剩下的人中没有足够的人凑成一对，
所以第二行不再执行。
所以，到这里算法结束，
这里n仍然是2，这是不正确的。
事实上，这样的算法就是被称为有缺陷的，
因为它有一个错误。
让我们用新的伪代码来纠正这一错误。
让n等于0。
对于房间中的每一对人，
设n=n+2。
如果有一个落单的人，
设n=n+1。
为了解决这个特别的难题，
我们在第四行引入了一个条件，
或称为一个分支，
当只有一个人
无法配对时执行。
所以，现在无论是1或3，
或其它任意的奇数人数，
这个算法都能计数他们。
我们能不能做得更好？
我们可以3个、4个或甚至5个、10个的数，
但是更多的人
会使这在表达上有点儿困难。
在最后
是用计算机还是由人类执行，
算法只是一组指令，
通过使用它我们解决难题。
这些只是三种情况。
你会用算法解决什么问题？