一、递归与分治概述:
1、分治方法在于分和治。将一定规模的问题划分成性质相同的若干个小问题,分;对于每个小问题,进行所需要进行的操作,如排序等。
2、关于递归:
(1)递归中需要的成分是递归边界和递归规则,没有递归边界递归无法停止、无法进行。
(2)通过将各层的关系从小到大逐渐带入,可以求解出一个函数的非递归表达式。
(3)n该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
3、Ackerman函数:
Ackerman函数的定义为:
根据关系可以递推出来:
在m取不同的值的过程中,该函数的递推关系式也不同。只是一种无法用单一的非递归关系表达的函数。
4、在Ackerman函数中,定义它的逆拟函数α(n)为使A(x)>n成立的最小的x。
5、整数划分问题:
对于整数的不同划分,考虑以下几种不同的情况:(1)m>n:q(n,m)=q(n,n)
(2)m=n:q(n,m)=1+q(n,m-1)
(3)m<n:q(n,m)=w(n,m)+q(n,m-1)
又:w(n,m)=q(n-m,m)
(4)m=1:q(n,1)=1
6、汉诺塔问题:
思路:将前n-1个元素移动到c上,然后将第n个移动到b上,再将c上的n-1个移动到b上。
注意边界条件是:如果只有一个元素,直接move到b上。
void Move(int no,char a,char b){
printf("Move %d from %c to %c.\n",no,a,b);
}
void Hanoi(int n,char a,char b,char c){
if(n==1){
Move(1,a,b);
}
else{
Hanoi(n-1,a,c,b);
Move(n,a,b);
Hanoi(n-1,c,b,a);
}
}
7、分治法的基本思想:将一个叫难解决的大问题分成k个规模较小的子问题,逐个解决,分而治之。如果问题的规模还不够小,就继续划分,直到可以直接解决这个小问题。将求出的小问题自下而上的合并,最终得到问题的解
8、递归的概念:
递归算法:直接或间接地调用自身的算法。
递归函数:用函数自身给出定义的函数。
使用递归技术使得算法的描述简捷且易于理解
10、分治法满足的要求:
(1)问题的规模缩小到一定的程度就可以解决
(