什么是算法?

书中的解释是:

算法 (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项。第三种方法,人已经将通项公式计算出来了,留给计算机的就是数值计算。

对于计算机来说哪种方法最友好呢?

自然是第三种。要知道,计算机的数值运算要比我们人脑快许多的,至于通项公式是怎么想出来的,计算机说,“交给你了,哥们”。第二种方法计算机要循环往复的去计算,那是不是比一步到位要复杂一点呢?第一种方法递归就像俄罗斯套娃,那个只能大喊,“禁止套娃”,哈哈。

原文地址:https://www.cnblogs.com/arduka/p/12662857.html