ch5 常见算法
1.累加/累积
累加(累积)是我们经常用到的方法,比如我们之前做过的最简单的累加,求100以内的和就是累加,累加(累积)是将一系列数据的和(积)存入结果中。
累加形式:V=V+e+....;
累积形式:V=V*e*....;
V是累加(累积)的结果,e是递增表达式。我们的累加(累积)一般是通过循环结构来实现。
算法的要点:
①. 对循环的控制,比如我们求1-100以内的和,条件就是i<100
②. 递增表达式e的计算。
所以,这两个问题做到了,问题就能得到解决。
2.递推
我们以斐波拉契数列问题为例进行阐述,斐波拉契数列为0、1、1、2、3、5、8、13、21、…表现斐波拉契数列为瘦柱状图的形式,如下 :
我们现在所要解决的问题是求取第n个位置的数值,下面我们正式开始考虑能否用递推解决这个问题(关于递推和递归的区别,将会在下文阐述):
我们考察3号位置,我们发现3号位置的值依赖于1号位置和2号位置,即在1号位置的值和2号位置的值的基础上,我们再进行一些(一个)操作就可以得到3号位置的值。在本例中,这个操作为加法运算。
我们再考察4号位置,同样我们发现4号位置的值依赖于2号位置和3号位置。
我们现在可以建立一种递推关系:F(n) = F(n-2) + F(n-1)。
至此,我们可以抽象出一种模式,这种模式告诉我们:待求位置的值仅仅依赖于前两个位置的值,再进行加法操作即可。换句话说,如果我们知道前两个位置的值,第三个位置的值就可以得到。
是否在起点的临近区间内存在这种模式决定了这个问题能否用递推解决。这里的起点和数学归纳法中的起点的含义一样。
所以本问题可以用递推解决。
3.迭代
迭代是一种不断用变量的新值迭代旧值的过程,使得新值不断的接近目标值。
1. 迭代变量:不断用新值代替旧值的变量,如迭代法求最大公约数中,被除数将除数迭代,除数被余数迭代。
2. 迭代条件的控制:迭代条件一般分为两种,一种是固定次数的迭代,另一种是次数无法确定,有一个结束迭代的条件。
4.穷举
eg:百钱百鸡问题。
有时我们遇到问题,没有更好的解决方法的时候,也就是找不到更好的解决途径,就可以考虑我们这种 最“笨”的方法,即将所有可能的情况列举出来,然后通过逐个验证是否能解决问题。从而得到问题的解。
穷举的算法很简单,但往往计算量比较大,而计算机的优势在于,运算速度快,可以轻松的胜任这类问题的求解。
5.递归
- public class Recursion{
- public static void main(String args[]){
- recursion(4267) ;
- }
- public static void recursion(int value){
- int quotient ;
- quotient = value/10 ;
- if(quotient!=0){ recursion(quotient) ;}
- System.out.println(value%10) ;
- }
- }
递归是如何帮助我们以正确的顺序打印这些字符呢?下面是这个函数的工作流程。
1. 将参数值除以10
2. 如果quotient的值为非零,调用binary-to-ascii打印quotient当前值的各位数字
3. 接着,打印步骤1中除法运算的余数
注意在第2个步骤中,我们需要打印的是quotient当前值的各位数字。我们所面临的问题和最初的问题完全相同,只是变量quotient的 值变小了。我们用刚刚编写的函数(把整数转换为各个数字字符并打印出来)来解决这个问题。由于quotient的值越来越小,所以递归最终会终止。