分治的实现::递归程序设计

转载 2006年06月16日 23:18:00
【分治算法】
是一种思想,你拿到的问题往往不会是很简单的事情,而再复杂再难的问题都可以分解成一些有限的简单问题的和,这就是分治法的原理。

举个最简单的例子,计算阶乘之和n!+(n-1)!+...+1!:

n可以取大取小,问题的范围可以大可以小,如果小就比较容易,比如1!=1这是己知,如何将大问题化成小问题,找它们之间的联系:

如果n=k已经解决,那么n=k+1能否解决,如何解决?

很显然:n=k+1的情况就是将n=k的结果加上(k+1)!的值。

【递归程序设计】
是一种算法常用设计方法,在高级语言中,函数之间可以进行嵌套调用,用栈的机制实现,这样的做法可以使我们在算法设计的时候能够达到套调算法设计。

int facsum(int n)
{
  if(n==1)return 1;
  return fac(n)+facsum(n-1);
}
/*fac()为求阶乘函数,facsum()为阶乘求和函数*/

“if(n==1)return 1;”为小问题、简单问题解的直接描述,在递归中称为递归边界,没有设定边界的递归是只能‘递’不能‘归’的,即死循环。

“return fac(n)+facsum(n-1);”中将n的范围缩小:n-1,以此将大问题化为类似的小问题,类似很重要,如果不类似就不能调同一个函数,这很显然。——这样一个过程就是分治算法的实现。

[阶乘求和可以用更高效率的算法求解,以上只是做为一个简单例子]

再举一例,将数组的元素逆置:

void inverse(int a[],int n)
{
  if(__①__)return;
  swap(a[0],a[n-1]);/*swap(a,b)为交换a,b的值*/
  inverse(__②__);
}

①处为小问题解描述,也是递归边界,怎样的小问题是很显然的呢?当数组的元素个数小于2时是不需要逆置的,所以填:n<2
②交换之后进行递归,分解成小问题,两端的已经交换,所以往中间靠,所以填:a+1,n-2

这样的问题有很多很多,如拆半法查找,用二分法求方程的根等等。都离不开两点:1、小问题的描述,即递归边界,2、将大问题化成小问题。
拆半法查找的小问题是:low==high;二分法求根的小问题是fabs(x1-x2)<eps。

PS:再加点吧,我竟没有想到汉诺塔这么经典的递归设计问题,有很多初学朋友不太明白程序的意图,你可以借助我上面讲的加深理解,书中的经典程序大致如下:
void move(int n,int from,int med,int to)
{
     if (n==1)
        printf("%d-->%d/n",from,to);
     else
     {
         move(n-1,from,to,med);
         printf("%d-->%d/n",from,to);
         move(n-1,med,from,to);
     }
}
这是一个核心函数,
if(n==1)即小问题描述,也就是递归边界

move(n-1,from,to,med);
printf("%d-->%d/n",from,to);
move(n-1,med,from,to);

是把问题的规模化小,也就是分而治之的思想,不管过程有多复杂,只要能把问题的规模化小,就可以运用分治+递归设计程序。

从零开始学递归与分治

递归的定义: 程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题...
  • qq_32400847
  • qq_32400847
  • 2016年04月01日 22:08
  • 1367

分治与递归(算法分析与设计)

1.strassen矩阵乘法 a.非递归版 #include #include using namespace std; int main() { int n; cout B; cout...
  • ChinaJane163
  • ChinaJane163
  • 2015年09月24日 22:04
  • 842

计算机算法设计与分析——递归与分治策略(一)

递归: 直接或者间接地调用自身的算法称为递归。用函数自身给出定义的函数成为递归函数。使用递归技术往往使函数的定义和算法的描述简洁且易于理解。有些数据结构,如二叉树等,由于其本身固有的递归特性,特别适...
  • qq_21122519
  • qq_21122519
  • 2017年04月05日 18:07
  • 171

分治策略(递归,排列问题)

1、递归概念       直接或者间接调用自身的算法叫做递归算法。用函数自身给出定义的函数称为递归函数。有些数据结构,比如二叉树等,由于自身固有的递归特性,特别适合用递归来描述。        递归算...
  • Robin__Chou
  • Robin__Chou
  • 2015年03月05日 17:40
  • 1760

递归、分治策略、动态规划以及贪心算法之间的关系

最近集中研究计算智能,其中涉及到递归和动态规划,动态规划实现中又用到了递归,忽然发现这两个概念的差别分得不太清楚。索性把递归、分治策略、动态规划、贪婪选择之间的联系与区别都一并搞清楚吧。...
  • tyhj_sf
  • tyhj_sf
  • 2017年01月01日 23:01
  • 2092

五大经典算法一 递归与分治

递归算法:直接或者间接不断反复调用自身来达到解决问题的方法。要求原始问题可以分解为相同问题的子问题。、 需要: 1 递归边界 2 自身调用 特点分析: 递归思路简单清晰,如果分析出将很快得到结果;递归...
  • yanerhao
  • yanerhao
  • 2017年03月21日 12:06
  • 657

本文专注于<递归算法和分治思想>

初衷:博主看到网上有很多人贴出各种OJ上的AC代码,很多都会标注上“递归”两字 我刚开始学习递归算法和分治法的时候,苦于没有人写出递归算法和分治法的详细解析,很难系统地学习 所以小博主冒然写一篇总...
  • haozi3156666
  • haozi3156666
  • 2014年05月14日 15:40
  • 823

递归与分治算法实验报告

问题1:集合划分 算法思想:对于n个元素的集合,可以划分为由m个子集构成的集合,例如{{1,2}{3,4}}就是由2个子集构成的非空子集。假设f(n,m)表示将n个元素划分成由m个子集构成的集合的个...
  • u010158265
  • u010158265
  • 2013年04月10日 14:19
  • 1362

递归分治-大整数乘法

最近在学算法,想着不能只是学,要深刻领悟,需要记录,需要写代码,需要分析……所以就诞生了这篇博客。问题描述:设X和Y都是n位整数,计算它们的乘积XY。可以使用传统的数学计算方法,但是这样做计算步骤太多...
  • u013266600
  • u013266600
  • 2017年05月19日 22:34
  • 484

递归+分治+贪心+动态规划

递归 1. 定义:一个函数在结束之前,直接或间接调用自身称为递归。 2. 思想:将一个不好解决的大问题转化为若干小问题,再把这些小问题进一步分解为更小的小问题,直至每个小问题可以直接解决为止。 3. ...
  • htyurencaotang
  • htyurencaotang
  • 2013年07月06日 17:39
  • 3074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分治的实现::递归程序设计
举报原因:
原因补充:

(最多只允许输入30个字)