累加器

看一个题目:计算 1 + 2 + 3 + … + 99 + 100 的和。

算法思想非常简单:准备一个变量 sum,初始值是 0。书写 for 循环语句,让循环变量 i 按 1、2、3……的顺

序遍历。每遍历一个数字,就将 i 的值“加到 sum”中。for 循环结束,sum 也就是 1 到 100 的和了。

变量 sum 一点点变大,它是所有被遍历数字的和,叫做“累加器”。它如同一个盒子,让数字 1 到 100 依

次“装入”盒子,从而计算出它们的总和

根据上述算法思路,书写程序如下:

var sum = 0;

for(var i = 1 ; i <= 100 ; i++){

sum += i;

}

console.log(sum); //5050

运行程序,控制台输出 5050,这就是 1 到 100 的和。

注意到循环体内并没有输出语句,输出语句写在了循环的外部。这表示当循环结束之后,我们才查看 sum

的值。

值得一提的是,德国数学家高斯在幼年,就用“等差数列求和”的手段快速口算得出了 5050 这个结果。高

斯发现等差数列的和,等于数列首项加末项再乘以项个数除 2。即(1 + 100) × 100 ÷ 2,答案是 5050。

这里想说的是,相比人类的“技巧性”计算,计算机的算法是简单直接的,甚至可以用“粗暴”来形容。的

确,我们的程序并没有使用任何的计算窍门,就是“不厌其烦”地一个数字一个数字加到 sum 中。

这就是计算机和人类的区别:人类会总结规律,而计算机只会按照程序的步骤执行语句,不会思考。

累乘器

基于同样的算法原理,我们可以书写“累乘器”。比如题目:计算 8 的阶乘,即计算 1 × 2 × 3 …… 7 × 8。

代码如下:

var result = 1;

for(var i = 1 ; i <= 8 ; i++){

result *= i;

}

console.log(result);

累乘器的初始值是 1 而不是 0。这很好理解,因为 0 乘以任何数字都是 0,初始值如果是 0,那么变量 result

将永远是 0,不会产生任何变化。

循环的嵌套

解决一些复杂的题目的时候,可能会使用两层甚至多层循环语句。每层循环语句都会按照执行原理进行循环。

看一段简单的循环嵌套程序:

for(var i = 0 ; i < 3 ; i++){

for(var j = 0 ; j < 3 ; j++){

console.log("i 是" + i , "j 是" + j);

}

}

程序中有 2 个 for 语句,其中外层 for 语句的循环变量是 i,内层 for 语句的循环变量是 j,使用不同的循

环变量名是为了避免变量的命名冲突。

外层循环会让循环变量 i 的值依次成为 0、1、2。每遍历一个数字 i 的时候,都会执行一次内层循环.

内层循环会让循环变量 j 的值依次成为 0、1、2。而内层循环又处于外层循环中,所以 console.log()输出语句一共被执行了 9 次。

我们可以这么理解程序的执行过程:i 为 0 的时候,j 依次成为了 0、1、2;i 为 1 的时候,j 又一次依次

成为了 0、1、2;i 为 2 的时候,j 又一次依次成为了 0、1、2。

穷举法

计算机最突出的能力就是计算,它没有归纳总结、逻辑推理的能力。所以人们使用计算机解决问题的时候,

要“扬长避短”——充分发挥计算机的计算优势,而不要让它进行逻辑推理。穷举法就是这样的一种算法思想。

穷举法,顾名思义,是指根据题目的条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,

直到全部情况验证完毕。若某个情况符合题目的条件,则为本问题的一个解;若全部情况验证后都不符合题目的

条件,则本题无解。

我们通过一个案例演示,学习穷举法。

编程寻找 100 以内的既能被 3 整除,也能被 5 整除的数字。

如果不用电脑仅靠口算解决这道题,我们会试着发现答案的规律,从而简化问题。根据基本数学原理,因为

3、5 互斥,所以既能被 3 整除又能被 5 整除的数字肯定是 15 的倍数

计算机解决问题不需要进行题目的简化。计算机会采用相对“简单粗暴”的思想来解决问题:按 1、2、3、……

100 的顺序,依次测试每一个数字是不是既能被 3 整除也能被 5 整除。

这就是穷举思想。把所有可能的答案(1 到 100)都列出来,然后逐一验证是不是问题的解。

计算机会“傻傻地”、“不厌其烦地”执行这个过程:看看数字 1 是不是符合条件,看看数字 2 是不是符合

条件,看看数字 3 是不是符合条件……看看数字 100 是不是符合条件。

案例程序如下:

//在 1 到 100 的范围进行遍历

for(var i = 1 ; i <= 100 ; i++){

//看此数是否满足条件

if(i % 3 == 0 && i % 5 == 0){

console.log(i);

}

}