书中的解释是:
算法 (algorithm) 是对特定问题求解步骤的一种描叙,它是指令的有限序列,其中每一条指令表示一个或多个操作;此外,一个算法还应具有:有穷性,确定性,可行性,输入,输出 5个重要特性。
朴素的理解就是计算的方法,例如,求斐波那契数列的第n项:
[a_n=a_{n-1}+a_{n-2}
]
方法一:递归
function fib1(n) {
if (n <= 1) {
return n;
}
return fib1(n - 1) + fib1(n - 2);
}
方法二:迭代
function fib2(n) {
if (n <= 1) {
return n;
}
let [pre, curr] = [0, 1];
while (n-- > 1) {
[pre, curr] = [curr, pre + curr];
}
return curr;
}
方法三:通项公式直接计算
[F(n)=frac{1}{sqrt{5}}[(frac{1+sqrt{5}}{2})^n-(frac{1-sqrt{5}}{2})^n]
]
function fib3(n) {
var c = Math.sqrt(5);
return parseInt((Math.pow((1 + c) / 2, n) - Math.pow((1 - c) / 2, n)) / c);
}
斐波那契数列的第n项等于前两项之和,第一种方法“递归”直接把这种表述反应在程序上,最符合递推公式 an=an-1+an-2 的数学表述了。第二种方法“迭代”程序就像人一样从第一项开始加起来,不断循环反复的去做这个加法,直到加到第n项。第三种方法,人已经将通项公式计算出来了,留给计算机的就是数值计算。
对于计算机来说哪种方法最友好呢?
自然是第三种。要知道,计算机的数值运算要比我们人脑快许多的,至于通项公式是怎么想出来的,计算机说,“交给你了,哥们”。第二种方法计算机要循环往复的去计算,那是不是比一步到位要复杂一点呢?第一种方法递归就像俄罗斯套娃,那个只能大喊,“禁止套娃”,哈哈。