递归算法是什么 (递归算法是什么时候学的)
本文目录导航:
递归算法是什么?
递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。

递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。
绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。
计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。
递归算法
递归算法递归算法流程递归过程一般通过函数或子过程来实现。
递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。
递归算法的特点递归算法是一种直接或者间接地调用自身的算法。
在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。
所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。
递归次数过多容易造成栈溢出等。
所以一般不提倡用递归算法设计程序。
递归算法要求递归算法所体现的“重复”一般有三个要求: 一是每次调用在规模上都有所缩小(通常是减半); 二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入); 三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
举例描述:把一个整数按n(2<=n<=20)进制表示出来,并保存在给定字符串中。
比如121用二进制表示得到结果为:“”。
参数说明:s: 保存转换后得到的结果。
n: 待转换的整数。
b: n进制(2<=n<=20) void numbconv(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] = ABCDEFGHIJKLMNOPQRSTUVWXYZ[n%b]; s[len+1] = \0; } void main(void) { char s[20]; int i, base; FILE *fin, *fout; fin = fopen(, r); fout = fopen(, 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 c(形参);forward; procedure b; 局部说明 begin . . c(实参); . . end; procedure c; 局部说明; begin . . b; . . end; 这种方式是间接调用. 例1计算n!可用递归公式如下: fac:=n*fac(n-1) {当n>0时} fac(n)={ fac:=1; { 当n=0时} 可编写程序如下: program facn; var n:integer; function fac(n:integer):real; begin if n=0 then fac:=1 else fac:=n*fac(n-1); end; begin write(n=);readln(n); writeln(n,!=,fac(n):0:0); end. 例2 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法. 设n阶台阶的走法数为f(n) 显然有 n=1 f(n)={ f(n-1)+f(n-2) n>2 可编程序如下: program louti; var n:integer; function f(x:integer):integer; begin if x=1 then f:=1 else if x=2 then f:=2 else f:=f(x-1)+f(x-2); end; begin write(n=);read(n); writeln(f(,n,)=,f(n)) end.二 如何设计递归算法1.确定递归公式 2.确定边界(终了)条件三 典型例题例3 汉诺塔问题 如图:已知有三根针分别用1,2,3表示,在一号针中从小放n个盘子,现要求把所有的盘子 从1针全部移到3针,移动规则是:使用2针作为过度针,每次只移动一块盘子,且每根针上 不能出现大盘压小盘.找出移动次数最小的方案. 程序如下: program hanoi; var n:integer; procedure move(n,a,b,c:integer); begin if n=1 then writeln(a,->,c) else begin move(n-1,a,c,b); writeln(a,--->,c); move(n-1,b,a,c); end; end; begin write(Enter n=); read(n); move(n,1,2,3); end. 例4 快速排序 快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1, 处理结束. 程序如下: program kspv; const n=7; type arr=array[1..n] of integer; var a:arr; i:integer; procedure quicksort(var b:arr; s,t:integer); var i,j,x,t1:integer; begin i:=s;j:=t;x:=b ; repeat while (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; end until 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; begin write(input target=_blank>
什么是递归算法
1、递归算法概念:在函数或子过程的内部,直接或者间接地调用自己的算法。
2、基本信息:递归算法是把问题转化为规模缩小了的同类问题的子问题。
然后递归调用函数或过程来表示问题的解。
一个过程或函数直接或间接调用自己本身,这种过程或函数叫递归过程或函数。