循环和函数递归c语言 循环递推c语言( 二 )


(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低 。所以一般不提倡用递归算法设计程序 。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储 。递归次数过多容易造成栈溢出等 。所以一般不提倡用递归算法设计程序 。
递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件) , 无条件递归调用将会成为死循环而不能正常结束 。
例子如下:
描述:把一个整数按n(2=n=20)进制表示出来,并保存在给定字符串中 。比如121用二进制表示得到结果为:“1111001” 。
参数说明: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] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%b];
s[len+1] = '\0';
}
void
main(void)
{
char s[20];
int i, base;
FILE *fin, *fout;
fin = fopen("palsquare.in", "r");
fout = fopen("palsquare.out", "w");
assert(fin != NULLfout != 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;
这种方式是直接调用.
又如:
【循环和函数递归c语言 循环递推c语言】procedure b; procedure c;
begin begin?0?2
. .
. .
. .
c; b;
. .
. .
. .
end; end;
这种方式是间接调用.
例1计算n!可用递归公式如下:
1 当 n=0 时?0?2
fac(n)={n*fac(n-1) 当n0时
可编写程序如下:
program fac2;
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('fac(',n,')=',fac(n):6:0);
end.
例2 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法.
设n阶台阶的走法数为f(n)
显然有
1 n=1?0?2
f(n)={
f(n-1)+f(n-2) n2
可编程序如下:
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针作为过度针,每次只移动一块盘子,且每根针上

推荐阅读