资源描述:
《第2章 递归与分治策略ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第2章递归与分治策略将要求解的较大规模的问题分割成k个更小规模的子问题。算法总体思想nT(n/4)T(n/4)T(n/4)T(n/4)T(n)=对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。算法总体思想对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。nT(n)=n/4T(n/16)T(n/16)T(n/16)T(n/16)n/4T(n/16)T(n/16)T(n/16)T(n/16)n/4T
2、(n/16)T(n/16)T(n/16)T(n/16)n/4T(n/16)T(n/16)T(n/16)T(n/16)将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。算法总体思想将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。nT(n)=n/4T(n/16)T(n/16)T(n/16)T(n/16)n/4T(n/16)T(n/16)T(n/16)T(n/16)n/4T(n/16)T(n/16)T(n/16)T(n/16)n/4T(n/16)T(n/16)T(n/16)T(n/16)算法总体思想
3、nT(n)=n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。凡治众如治寡,分数是也。----孙子兵法2.1递归的概念直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段
4、,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。下面来看几个实例。例1阶乘函数阶乘函数可递归地定义为:边界条件递推方程边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。第n个阶乘函数可递归地计算如下:publicstaticintfactorial(intn){if(n==0)return1;returnn*factorial(n-1);}类成员访问级别为公有,在程序的任何
5、部分都可访问静态类方法,只有一份拷贝,调用为方法名(实际参数)例2Fibonacci数列无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为:边界条件递归方程第n个Fibonacci数可递归地计算如下:publicstaticintfibonacci(intn){if(n<=1)return1;returnfibonacci(n-1)+fibonacci(n-2);}例3Ackerman函数当一个函数及它的一个变量是由函数自身定义时,称这个函数是双递归函数。Ackerman函数A(n,m)定义如下:前2例中
6、的函数都可以找到相应的非递归方式定义:但本例中的Ackerman函数却无法找到非递归的定义。例3Ackerman函数A(n,m)的自变量m的每一个值都定义了一个单变量函数:m=0时,A(n,0)=n+2m=1时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2,和A(1,1)=2故A(n,1)=2*nm=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)=2n。m=3时,类似的可以推出A(n,3)=m=4时,A(n,4)的增长速度非常快,以至于没有适当的数学式
7、子来表示这一函数。定义单变量的Ackerman函数A(n)为,A(n)=A(n,n)。定义其拟逆函数α(n)为:α(n)=min{k|A(k)≥n}。即α(n)是使n≤A(k)成立的最小的k值。α(n)在复杂度分析中常遇到。对于通常所见到的正整数n,有α(n)≤4。但在理论上α(n)没有上界,随着n的增加,它以难以想象的慢速度趋向正无穷大。例4整数划分问题将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。例如正整数6有如下11种不同的划分:6;5+1;
8、4+2,4+1+1;3+