当前位置:文档之家› 递归算法

递归算法

java递归算法序列1 1 2 3 5 8 13 21 34编写一个递归方法计算序列[Java编程]悬赏点数10 1个回答588次浏览江苏过客2009-4-5 20:55:30 58.208.132.* 18...@ 举报java递归算法序列1 1 2 3 5 8 13 21 34编写一个递归方法计算序列回答登录并发表回答取消在谷歌搜索java递归算法序列1 1 2 3 5 8 13 21 34编写一个递归方法计算序列回答按时间排序按投票数排序ai000012009-9-21 20:37:04 119.61.11.* 举报递归算法:是一种直接或者间接地调用自身的算法。

在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法的特点递归过程一般通过函数或子过程来实现。

递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。

递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。

然后递归调用函数(或过程)来表示问题的解。

递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身。

(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。

所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。

递归次数过多容易造成栈溢出等。

所以一般不提倡用递归算法设计程序。

递归算法所体现的“重复”一般有三个要求:一是每次调用在规模上都有所缩小(通常是减半);二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

例子如下:描述:把一个整数按n(2<=n<=20)进制表示出来,并保存在给定字符串中。

比如121用二进制表示得到结果为:“1111001”。

参数说明:s: 保存转换后得到的结果。

n: 待转换的整数。

b: n进制(2<=n<=20)voidnumbconv(char *s, int n, int b){int len;if(n == 0) {strcpy(s, "");return;}/* figure out first n-1 digits */numbconv(s, n/b, b);/* add last digit */len = strlen(s);s[len] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%b];s[len+1] = '\0';}voidmain(void){char s[20];int i, base;FILE *fin, *fout;fin = fopen("palsquare.in", "r");fout = fopen("palsquare.out", "w");assert(fin != NULL && fout != NULL);fscanf(fin, "%d", &base);/*PLS set START and END*/for(i=START; i <= END; i++) {numbconv(s, i*i, base);fprintf(fout, "%s\n", s);}exit(0);}递归算法简析(PASCAL语言)递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写程序能是程序变得简洁和清晰.一递归的概念1.概念一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数). 如:procedure a;begin...a;...end;这种方式是直接调用.又如:procedure b; procedure c;begin begin. .. .. .c; b;. .. .. .end; end;这种方式是间接调用.例1计算n!可用递归公式如下:1 当n=0 时fac(n)={n*fac(n-1) 当n>0时可编写程序如下:varn:integer;function fac(n:integer):real;beginif n=0 then fac:=1 else fac:=n*fac(n-1)end;beginwrite('n=');readln(n);writeln('fac(',n,')=',fac(n):6:0);end.例2 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法. 设n阶台阶的走法数为f(n)显然有1 n=1f(n)={f(n-1)+f(n-2) n>2可编程序如下:program louti;var n:integer;function f(x:integer):integer;beginif x=1 then f:=1 elseif x=2 then f:=2 else f:=f(x-1)+f(x-2);end;beginwrite('n=');read(n);writeln('f(',n,')=',f(n))end.二,如何设计递归算法1.确定递归公式2.确定边界(终了)条件三,典型例题例3 梵塔问题如图:已知有三根针分别用1,2,3表示,在一号针中从小放n个盘子,现要求把所有的盘子从1针全部移到3针,移动规则是:使用2针作为过度针,每次只移动一块盘子,且每根针上不能出现大盘压小盘.找出移动次数最小的方案.程序如下:varn:integer;procedure move(n,a,b,c:integer);beginif n=1 then writeln(a,'--->',c)else beginmove(n-1,a,c,b);writeln(a,'--->',c);move(n-1,b,a,c);end;end;beginwrite('Enter n=');read(n);move(n,1,2,3);end.例4 快速排序快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1, 处理结束.程序如下:program kspv;const n=7;typearr=array[1..n] of integer;vara:arr;i:integer;procedure quicksort(var b:arr; s,t:integer);var i,j,x,t1:integer;begini:=s;j:=t;x:=b;repeatwhile (b[j]>=x) and (j>i) do j:=j-1;if j>i then begin t1:=b; b:=b[j];b[j]:=t1;end;while (b<=x) and (i<j) do i:=i+1;if i<j then begin t1:=b[j];b[j]:=b;b:=t1; enduntil i=j;b:=x;i:=i+1;j:=j-1;if s<j then quicksort(b,s,j);if i<t then quicksort(b,i,t);end;beginwrite('input data:');for i:=1 to n do read(a);writeln;quicksort(a,1,n);write('output data:');for i:=1 to n do write(a:6);writeln;end.递归算法时间:2007-06-14作者:佚名编辑:本站点击:273 [评论]--递归算法程序调用自身的编程技巧称为递归(recursion)。

一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

注意:(1) 递归就是在过程或函数里调用自身;(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

一个比较经典的描述是老和尚讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,……。

这样没完没了地反复讲故事,直到最后老和尚烦了停下来为止。

反复讲故事可以看成是反复调用自身,但如果不能停下来那就没有意义了,所以最终还要能停下来。

递归的关键在于找出递归方程式和递归终止条件。

即老和尚反复讲故事这样的递归方程式要有,最后老和尚烦了停下来这样的递归的终止条件也要有。

阶乘的算法可以定义成函数当n>0时,用f(n-1)来定义f(n),用f(n-1-1)来定义f(n-1)……,这是对递归形式的描述。

当n=0时,f(n)=1,这是递归结束的条件。

例:用递归策略求N!的解。

N!=1*2*3*...*N分析:(1) 不运用递归的解法(2) 运用递归策略N!=1*2*3*...*N=[1*2*3*...*(N-1)]*N(N-1)!=1*2*3*...*(N-1)设f(N)=N!那么f(N-1)=(N-1)!则f(N)=f(N-1)*N这就是递归式子,由于式子中有N-1,所以N>=1,递归出口的条件是N=1时。

函数模式:function f(n:integer):longint;var...beginif 递归出口的时候thenf:=1elsef:=f(n-1)*n;end;递归算法一般用于解决三类问题:⑴. 数据的定义形式是按递归定义的。

比如阶乘的定义。

例1又如裴波那契数列的定义:f(n)=f(n-1)+f(n-2); f(0)=1; f(1)=2对应的递归程序为:var n:integer;function f(n:integer):longint;begincase n of0:f:=1; { 递归结束条件}1:f:=2;elsef:=f(n-1)+f(n-2) {递归调用}endend;beginreadln(n);writeln(f(n))end.这类递归问题往往又可转化成递推算法,递归边界作为递推的边界条件。

相关主题