文档介绍:该【递归算法详解 】是由【春天春雨】上传分享,文档一共【62】页,该文档可以免费在线阅读,需要了解更多关于【递归算法详解 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。递归文科一、的基本观点。一个函数、观点或数学构,假如在其定或明内部直接或接地出其自己的引用,或许是了描绘的某一状,必需用至它的上一状,而描绘上一状,又必用到它的上一状??种用自己来定自己的方法,称之或定。在程序中,函数直接或接用自己,就被称用。二、的最用:通各关系及初求数列的某一。在数学中,有一种数列,很求出它的通公式,但数列中各关系却很,于是人想出另一种法来描绘种数列:通初及an与前面近几之的关系。要使用的描绘方式,起码要供给两个信息:一是最前面几的数,一是数列各的关系。比方乘数列1、2、6、24、120、720??假如用上边的方式来描绘它,是:1,n1annan1,n1假如需要写一个函数来求an的,那么能够很简单地写成:intf(intn){if(n==1)return1;returnn*f(n-1);}就是函数的最形式,从中能够明看出函数都有的一个特色:先理一些特别状况——也是函数的第一个出口,再理关系——形成函数的第二个出口。函数的行程是先通关系不断地小的模,直到到能够作特别状况理而得出直接的果,再通关系逐返回到本来的数据模,最得出的解。以上边求乘数列的函数f(n)例。如在求f(3),因为3不是特别,所以需要算3*f(2),但f(2)是它自己的用,于是再算f(2),2也不是特别,需要算2*f(1),需要知道f(1)的,再算f(1),1是特别,于是直接得出f(1)1,返回上一步,得f(2)2*f(1)2,再返回上一步,得f(3)3*f(2)3*26,进而得最解。用解来明,就是f(3)的行程f(2)的行程f(1)的行程(特别判断:)(特别判断:)(特别判断:)31,向下。21,向下。11,由特别情(关系理:)(关系理:)况出口直接返回1。求3*f(2),需要先求2*f(1),需要先算f(2),用f(2),算f(1),用f(1),且自己挂起??且自己挂起??????????下边再看一个稍复点的例子。【例1】数列{an}的前几1、1、1、1、??1**********入n,程求an的精准分数解。剖析:个目易,a11,其余状况下有an1。如要求数解的,基本1an1已能够写出函数了。但因为目要求精准的分数解,需做一些整。an1q,p由关系,有an11p,再分化,即得an。但一个:an1qpq11p求出an1,需要返回两个整数:分子q与分母p,而往常的函数只好返回一个整数。个一般有两解决法,一种是求函数返回一个构体量,就能够返回两个量了(其能够不仅两个呢);另一种是在求函数的参数表中加入两个指量或引用量,通参数回数。但因为后一种做法会使程序构不清楚——返回是由参数表获得的,所以我使用前一种方法。此外,在通an1q得出anp后,an就已经是最分数了,无化。明ppq以下:若q是最分数,即明p,q的最大公数1,即任何1rq,都有qmodr与ppmodr不全0,不防qmodra、pmodrb,有(pq)modr(ab)modr只需a与b不全0,且ar,br,就有a与(ab)modr不全0。所以任何的1rq,有pmodr与(pq)modr不全0。而于qrp的状况而言,pmodra,有(pq)modr(aq)modr因为0ar,0qr,所以相同有pmodr与(pq)modr不全为0。所以对随意1rp,都有pmodr与(pq)modr不全为0,所以它们的最大条约pq数为1,即是最简分数。固然这是个要求an1(即)是最简分数的结论,但因为数pqp列第二项为12,是最简分数,所以能够证明第三项也是最简分数,同时也证明对所有的an,求出的p就是最简分数,不必化简。pq详细代码以下:1357902468N(0N9)0Nii1i2NNNiNi2i12(i1),MAX*sizeof(char));t[n]='\0';for(i=0;i<n;i++){t[q[i]]='Q';cout<<t<<endl;t[q[i]]='.';}cout<<endl;}booltest(inti,intk){intj;j=0;while(j<k&&abs(j-k)!=abs(q[j]-i))j++;if(j==k&&mark[i]==false)returntrue;elsereturnfalse;}voidsearch(intk){if(k==n){write();c++;return;}inti;for(i=0;i<n;i++)if(test(i,k)){mark[i]=true;q[k]=i;search(k+1);mark[i]=false;}intmain(){cin>>n;memset(mark,0,MAX*sizeof(bool));c=0;search(0);cout<<c<<endl;system("pause");return0;}