d-1)
Elsesearch(x,mid+1,r);
End
elseWriteln(x:
5,‘no');
End;
Begin
Writeln(‘inpnutgeshu');
Fork:
=1tondoread(a[k]);
Read(x);
F:
=1;r:
=n;
Search(x,f,r);
End.
2.hanoi塔问题。
递归:
procedureHanoi(n:
integer;x,y,z:
char);
Begin
Ifn=1thenwriteln(x,--'n-,--',z)
Elsebegin
Hanoi(n-1,x,z,y);
Writeln(x,--',n-,--',z;)
Hanoi(n-1,y,x,z)
End;
End;
Begin
Write(‘inpunt:
');
Read(n);
Hanoi(n,'A','B','C')
End.
3.有n个硬币(n为偶数)正面朝上排成一排,每次将n-1个硬币翻成朝上为止。
编程让计算机把翻硬币的最简过程及翻币次数打印出来(用*代表正面,用0代表反面)。
基本形式:
D[1]=0;d[2]=1
递归式:
d[n]=(n-1)*(d[n-1]+d[n-2])
varn:
integer;
functiond(n:
integer):
longint;
begin
casenof
1:
d:
=0;
2:
d:
=1;
elsed:
=(n-1)*(d(n-1)+d(n-2));
end;
end;
begin
repeat
write('n=');
readln(n);
ifn<=0thenwriteln('Oncemore!
')
untiln>0;
writeln('d=',d(n));
readln;
end.
4.有一对雌雄兔子,假定两个月便可以繁殖雌雄各一对兔子。
问n个月后共有多少对兔子?
递归的三要素:
递归的形式:
T[n]=T[n-1]+T[n-2]基本:
T[1]=1,T[2]=1结束条件:
n个月programrabbit;
varn:
integer;
functionfa(n:
integer):
integer;
begin
ifn<3thenfa:
=1
elsefa:
=fa(n-1)+fa(n-2);
end;
begin
write('n=');readln(n);
writeln('Thenumberoftherabbits:
',fa(n));end.
5.梯有N阶,上楼可以一步上一价,也可以一次上二阶。
编一个程序,计算共有多少种不同的走法。
递归的形式:
s[n]=s[n-1]+s[n-2]
基本式子:
s[1]=1;s[2]=2
programupstairs;
varn:
integer;
functions(n:
integer):
longint;
begin
if(n=1)or(n=2)thens:
=n
elses:
=s(n-1)+s(n-2);
end;
begin
repeatwrite('N=');readln(n);untiln>0;
writeln('s=',s(n));readln;
end.
6.斐波那切数列
递归:
varm,p:
integer;
Functionfib(n:
integer):
integer;
Begin
Ifn=0thenfib:
=0
Elseifn=1thenfib:
=1
Elsefib:
=fib(n-1)+fib(n-2);
End;
Begin
Read(m);
P:
=fib(m);
Writeln(‘fib(',mm')=',p)
End.
7.设有2An个运动员要进行网球比赛。
现要设计一个满足以下要求的比赛日程表:
(1)、每个选手必须与其他n-1个选手各赛一次;
(2)、每个选手每天只能参赛一次;
(3)、循环赛在n-1天内结束。
programmatch;constk=3;n=8;
var
s:
array[1..n,1..n]ofinteger;i,j,p:
integer;ju:
boolean;
procedurecopy1(be,en:
integer;jug:
boolean;q:
integer);
varm,t,ban:
integer;
begin
ifjugthen
begin
ifbe=1then
beginifs[en,en]=0then
begincopy1(be,endiv2,true,qdiv2);
copy1((endiv2)+1,en,false,qdiv2);
end;
form:
=1toendo
fort:
=1toendos[m+q,t+q]:
=s[m,t]end
elsebeginifs[be+q-1,q]=0then
begincopy1(be,be+(qdiv2)-1,true,qdiv2);
copy1(be+(qdiv2),en,false,qdiv2)
end;
form:
=betoendofort:
=1toqdos[m+q,t+q]:
=s[m,t]endendelsebegin
ifs[be,q]=0then
begincopy1(be,be+(qdiv2)-1,true,qdiv2);
copy1(be+(qdiv2),en,false,qdiv2)
end;
form:
=betoendo
fort:
=1toqdos[m-q,t+q]:
=s[m,t]end
end;
begin
p:
=8;
fori:
=1tondo
forj:
=1tondo
s[i,j]:
=0;
fori:
=1tondo
begins[i,1]:
=i;ifodd(i)thens[i+1,2]:
=s[i,1]elses[i-1,2]:
=s[i,1];
end;
copy1(1,ndiv2,true,pdiv2);copy1((ndiv2)+1,n,false,pdiv2);
fori:
=1tondo
begin
forj:
=1tondowrite(s[i,j],'');
writeln;
end;
end.
以下是USACOcontest上的题目,全是递归
*****************************************
*****************************
BRONZEPROBLEMS
*****************************************
*****************************
三道题目,从11到13
*****************************************
*****************************
Problem11:
谷仓的安保[Traditional,2005]FarmerJohn给谷仓安装了一个新的安全系统,并且要给牛群中的每一个奶牛安排一个有效的密码。
一个有效的密码由L(3<=L<=15)个小写字母(来自传统的拉丁字母集'a'...'z')组成,至少有一个元音('a','e','i','o',或者'u'),至少两个辅音(除去元音以外的音节),并且有按字母表顺序出现的字母(例如,’abc'是有效的,而'bac'不是)<给定一个期望长度L和C个小写字母,写一个程序,打印出所有的长度为L、能由这些字母组成的有效密码。
密码必须按字母表顺序打印出来,一行一个。
题目名称:
passwd输入格式:
*第一行:
两个由空格分开的整数,L和C
*第二行:
C个空格分开的小写字母,密码是由这个字母集中的字母来构建的。
输入样例(文件passwd.in):
46atcisw输入详细说明:
由从给定的六个字母中选择的、长度为4的密码。
输出格式:
*第一至?
行:
每一个输出行包括一个长度为L
个字符的密码(没有空格)。
输出行必须按照字母顺序排列。
输出样例(文件passwd.out):
acis
acitaciwacstacswactwaistaiswaitwastwcist
ciswcitwistw
**********************************************************************
Problem12:
"跳房子"[HalBurch,2005]奶牛们按不太传统的方式玩起了小孩子们玩的跳房子"游戏。
奶牛们创造了
一个5x5的、由与x,y轴平行的数字组成的直线型网格,而不是用来在里面跳的、线性排列的、带数字的方格。
然后他们熟练地在网格中的数字中跳:
向前跳、向后跳、向左跳、向右跳
(从不斜过来跳),跳到网格中的另一个数字上。
他们再这样跳啊跳(按相同规
则),跳到另外一个数字上(可能是已经跳过的数字)。
一共在网格内跳过五次后,他们的跳跃构建了一个六位整数(可能以0开头,
例如000201)。
求出所有能被这样创造出来的不同整数的总数。
问题名称:
numgrid
输入格式:
*第1到5行:
这样的网格,一行5个整数
输入样例(文件numgrid.in):
11111
11111
11111
11121
11111
输出格式:
*第1行:
能构建的不同整数的总数
输出样例(文件numgrid.out):
15
输出详细说明:
111111,111112,111121,111211,111212,112111,1
12121,121111,121112,121211,121212,211111,21
1121,212111和212121能够被构建。
没有其它可能的数了。
*****************************************
*****************************
Problem13:
卫星照片[RobKolstad,2005]
FarmerJohn给他的农场买了WxH像素的卫星照片(1<=W<=80,1<=H
<=1000),希望找出最大的"连续的"(互相连接的)牧场。
任何一对像素,一个像素如果能横向的或纵向的与属于这个牧场的另一个像素相连,这样的牧场称作是连续的(这句话太难翻了,大家将就着理解一下,看了后面的范例应该不会影响做题—译者)。
(很容易创建形状稀奇古怪的牧场,甚至是围着其它圆圈的圆圈。
)每一张照片都数字化的抽象了,牧场区显示为"*",非牧场区显示为"."。
下面是一个10x5的卫星照片样例:
***
■■■■■■■
*******
■■■
.*...*
■■■■■■■■
■■■
■■■
这张照片显示了大小分别为4、16、6个像素的连续牧场区。
帮助FJ在他的每张卫星照片中找到最大的连续牧场。
问题名称:
satpix输入格式:
*第1行:
两个由空格分开的整数,H和W。
*第2到H+1行:
每一行包含W个"*"或者".",代表卫星照片的横向行。
输出样例(文件satpix.in):
105
***
■■■■■■■
*******
■■■
.*...*
■■■■■■■■
■■■
■■■
输出格式:
*第1行:
最大连续牧场的大小输出样例(文件satpix.out):
16