1.递推法
递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步,找出相邻几步的关系,从而达到目的,此方法称为递推法。
递推法是组合数学中的一个重要解题方法,许多著名问题(如menage问题、更列问题、跳蛙问题等)用递推法来解显得精巧简捷.鉴于这一方法在升学和竞赛中应用越来越广泛,掌握和运用这种方法,就显得更加重要.
用递推法解题,首先是要列出符合题意的递归关系式——递归方程,再解所得方程.建模的办法通常是按某一元素(或位置)或某一方式进行分类,再列式,而怎样正确地分类与讨论则是解题的关键.
例 用1、2、3三个数字写n位数,要求数中不出现紧挨着的两个1.问能构成多少个n位数?
解:设符合条件的n位数共有an种,按首位划分可分成:
Ⅰ.首位是2或3,则以下n-1位各有an-1个,共2an-1个;
Ⅱ.首位是1,第二位只能为2或3,共有2an-2个,
故an=2an-1+2an-2(个).
由初始条件a1=3,a2=8,结合特征方程,求得an= .
2. 递归法
递归指的是一个过程:函数不断引用自身,直到引用的对象已知。
递归算法包括“递推”和“回归”两部分。
递推:就是为得到问题的解,将它推到比原问题简单的问题的求解。
比如:为求N!,先求(N-1)!,因为(N-1)!更接近以知解0!=1;
再看看下面的过程:
3!=3*2!;2!=2*1!;1!=1*0!;0!=1;
注意:
(1)递推应有终止之时。例如,N!,当N=0时,0!=1为递推的终止条件,在此条件下,问题的解是明确的,缺少终止条件算法会失败。
(2)简单问题表示离递推终止条件更接近的问题。简单问题与原问题其解的算法是一致的,其差别主要反映在参数值上。例如,N!与(N-1)!其参数差1。参数的变化,使问题递推到有明确解的问题上。
回归:指简单问题得到解后,回归到原问题的解上来。
例如:当计算完(N-1)!后,回归计算N*(N-1)!,即得N!。注意:回归是递推的返回过程。
比如:0!=1;1!=1*0!;2!=2*1!;3!=3*2!
3.穷举搜索法
穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从众找出那些符合要求的候选解作为问题的解。
穷举法的思路是,列举出所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解答。
穷举算法模式:
(1)问题解的可能搜索的范围:用循环或循环嵌套结构实现;
(2)写出符合问题解的条件;
(3)能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。
4.贪婪法
贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪婪法不要回溯。
贪婪法之所以贪婪在于,只顾眼前利益,每一次找到的都是当前的最优解,而不是最终的最优解。
使用范围:
贪心选择性质:选择具有无后效性,即不依赖与以后将要作出的选择。
最优子结构:全局最优包含局部最优。
不能使用的范围:
1、 需要求解最值
2、 求出的解规定是最优解
5.分治法
把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。即对问题分而治之。
6.动态规划法
动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。
7.迭代法
迭代是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或者方程组)的过程,为实现这一过程所使用的方法统称为迭代法。
迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:
(1) 选一个方程的近似根,赋给变量x0;
(2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;
(3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。