递归算法详解完整版.docxVIP

  • 2
  • 0
  • 约1.4万字
  • 约 49页
  • 2023-08-24 发布于辽宁
  • 举报
递归算法详解 标)隹化管理处编码[BBX968T-XBB8968-NNJ668-MM9N] 冯文科一、递归的基本概念。 一个函数、概念或数学结构,如果在其定义或说明内部直接或间接地出现对其本身的引用,或者是为了描述问题的某一状态,必须要用至它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自己来定义自己的方法,称之为递归或递归定义。在程序设计中,函数直接或间接调用自己,就被称为递归调用。 二、递归的最简单应用:通过各项关系及初值求数列的某一项。 在数学中,有这样一种数列,很难求出它的通项公式,但数列中各项间关系却很简单,于是人们想出另一种办法来描述这种数列:通过初值及气与前面临近几项之间的关系。 要使用这样的描述方式,至少要提供两个信息:一是最前面几项的数值,一是数列间各项的关系。 比如阶乘数列 1、2、6、24、120、720…… 如果用上面的方式来描述它,应该是: 如果需要写一个函数来求气的值,那么可以很容易地写成这样: :心”“ if(n==1) return1; returnn*f(n-1); 这就是递归函数的最简单形式, 从中可以明显看出递归函数都有的一个特点:先处 理一些特殊情况一一这也是递归函数的第一个出口,再处理递归关系一一这形成递归函数的第二个出口。 递归函数的执行过程总是先通过递归关系不断地缩小问题的规模,直到简单到可以作为特殊情况处理而得出直接的结果,再通过递归关系逐层返回到原来的数据规模,最终得出问题的解。 以上面求阶乘数列的函数f(n)为例。如在求f⑶时,由于3不是特殊值,因此需要计算3*f(2),但f(2)是对它自己的调用,于是再计算f(2),2也不是特殊值,需要计算2*f⑴,需要知道f⑴的值,再计算f⑴,1是特殊值,于是直接得出f⑴=1,返回上一步,得f(2)=2*f⑴=2,再返回上一步,得f⑶=3*f⑵=3*2=6,从而得最终解。 用图解来说明,就是 【例1】数列{匕}的前几项为1、古^1r、1?—1+商1+r1+—1+1 输入n,编程求an的精确分数解。 分析: 这个题目较易,发现a=1,其它情况下有a=—^。如要求实数解的话,这基1n1+an-1 本已经可以写出递归函数了。但由于题目要求精确的分数解,还需做一些调整。设a=区,则由递归关系,有a=——-——=一-一=一P一,再约分化简,即得a。但发现n-1pn1+a1+qp+qn一个问题:求出。时,需要返回两个整数:分子q与分母p,而通常的函数只能返回一n-1个整数。 这个问题一般有两类解决办法,一种是让求值函数返回一个结构体变量,这样就可以返回两个变量了(其实还可以不只两个呢);另一种是在求值函数的参数表中加入两个指针变量或引用变量,通过参数给带回数值。但由于后一种做法会使程序结构不清晰一一返回值是由参数表得到的,因此我们使用前一种方法。 另外,在通过a=q得出a=—后,a就已经是最简分数了,无须化简。证n-1pnp+qn明如下: 若q是最简分数,即说明p,q的最大公约数为1,即对任何1VrVq,都有qmodr与Ppmodr不全为0,不防记qmodr=a、pmodr=b,则有 只要a与b不全为0,且aVr,bVr,就有a与(a+b)modr不全为0。因此对任何的1Vrq,有pmodr与(p+q)modr不全为0。 而对于qVrp的情况而言,记pmodr=a,则有 由于0aVr,0VqVr,因此同样有pmodr与(p+q)modr不全为0。 所以对任意1Vrp,都有pmodr与(p+q)modr不全为0,因此它们的最大公约数为1,即_L是最简分数。虽然这是个要求a(即q)是最简分数的结论,但由于数p+qn-1p 列第二项为2,是最简分数,因此可以证明第三项也是最简分数,同时也证明对所有的a,求出的―、就是最简分数,无须化简。 np+q具体代码如下: N(0N9)0-Nii+1i+2NNNiNi2i+12(i+1),MAX*sizeof(char)); t[n]=\0; for(i=0;in;i++) ( t[q[i]]=Q; couttendl; t[q[i]]=.; } coutendl; booltest(inti,intk)( intj; j=0; while(jkabs(j-k)!二abs(q[j]-i)) j++; if(j==kmark[i]==false) returntrue; else returnfalse;}voidsearch(intk)( if(k==n) write(); c++; return; } inti; for(i=0;in;i++) if(test(i,k)) (mark[i]=true;q[k]=i;search(k+1);mark[i]=false; } } intmain() 六、

文档评论(0)

1亿VIP精品文档

相关文档