Else search(x,mid+1,r);
End
else Writeln(x:
5,‘no’);
End;
Begin
Writeln(‘input n ge shu’);
For k:
=1 to n do read(a[k]);
Read(x);
F:
=1;r:
=n;
Search(x,f,r);
End.
塔问题。
递归:
procedure Hanoi(n:
integer;x,y,z:
char);
Begin
If n=1 then writeln(x,’--’n,’---’,z)
Else begin
Hanoi(n-1,x,z,y);
Writeln(x,’--’,n,’---’,z);
Hanoi(n-1,y,x,z)
End;
End;
Begin
Write(‘input n:
’);
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])
var n:
integer;
function d(n:
integer):
longint;
begin
case n of
1:
d:
=0;
2:
d:
=1;
else d:
=(n-1)*(d(n-1)+d(n-2));
end;
end;
begin
repeat
write('n=');
readln(n);
if n<=0 then writeln('Once more!
')
until n>0;
writeln('d=',d(n));
readln;
end.
4.有一对雌雄兔子,假定两个月便可以繁殖雌雄各一对兔子。
问n个月后共有多少对兔子
递归的三要素:
递归的形式:
T[n]= T[n-1]+ T[n-2]
基本:
T[1]=1,T[2]=1
结束条件:
n个月
program rabbit;
var n:
integer;
function fa(n:
integer):
integer;
begin
if n<3 then fa:
=1
else fa:
=fa(n-1)+fa(n-2);
end;
begin
write('n=');readln(n);
writeln('The number of the rabbits:
',fa(n));
end.
5.梯有N阶,上楼可以一步上一价,也可以一次上二阶。
编一个程序,计算共有多少种不同的走法。
递归的形式:
s[n]=s[n-1]+s[n-2]
基本式子:
s[1]=1;s[2]=2
program upstairs;
var n:
integer;
function s(n:
integer):
longint;
begin
if (n=1)or(n=2) then s:
=n
else s:
=s(n-1)+s(n-2);
end;
begin
repeat
write('N=');readln(n);
until n>0;
writeln('s=',s(n));
readln;
end.
6.斐波那切数列
递归:
var m,p:
integer;
Function fib(n:
integer):
integer;
Begin
If n=0 then fib:
=0
Else if n=1 then fib:
=1
Else fib:
=fib(n-1)+fib(n-2);
End;
Begin
Read(m);
P:
=fib(m);
Writeln(‘fib(’,mm’)=’,p)
End.
7.设有2^n个运动员要进行网球比赛。
现要设计一个满足以下要求的比赛日程表:
(1)、每个选手必须与其他n-1个选手各赛一次;
(2)、每个选手每天只能参赛一次;
(3)、循环赛在n-1天内结束。
program match;
const k=3;n=8;
var
s:
array[1..n,1..n] of integer;
i,j,p:
integer;
ju:
boolean;
procedure copy1(be,en:
integer;jug:
boolean;q:
integer);
var m,t,ban:
integer;
begin
if jug then
begin
if be=1 then
begin if s[en,en]=0 then
begin copy1(be,en div 2,true,q div 2);
copy1((en div 2)+1,en,false,q div 2);
end;
for m:
=1 to en do
for t:
=1 to en do
s[m+q,t+q]:
=s[m,t]
end
else begin if s[be+q-1,q]=0 then
begin copy1(be,be+(q div 2)-1,true,q div 2);
copy1(be+(q div 2),en,false,q div 2)
end;
for m:
=be to en do
for t:
=1 to q do
s[m+q,t+q]:
=s[m,t]
end
end
else begin
if s[be,q]=0 then
begin copy1(be,be+(q div 2)-1,true,q div 2);
copy1(be+(q div 2),en,false,q div 2)
end;
for m:
=be to en do
for t:
=1 to q do
s[m-q,t+q]:
=s[m,t]
end
end;
begin
p:
=8;
for i:
=1 to n do
for j:
=1 to n do
s[i,j]:
=0;
for i:
=1 to n do
begin
s[i,1]:
=i;
if odd(i) then s[i+1,2]:
=s[i,1]
else s[i-1,2]:
=s[i,1];
end;
copy1(1,n div 2,true,p div 2);
copy1((n div 2)+1,n,false,p div 2);
for i:
=1 to n do
begin
for j:
=1 to n do
write(s[i,j],' ');
writeln;
end;
end.
以下是USACO contest上的题目,全是递归
-----------------------------------------------
**********************************************************************
BRONZE PROBLEMS
**********************************************************************
三道题目,从11到13
**********************************************************************
Problem 11:
谷仓的安保 [Traditional, 2005]
Farmer John给谷仓安装了一个新的安全系统,并且要给牛群中的每一个奶牛安排一个有效的密码。
一个有效的密码由L(3 <= L <= 15)个小写字母(来自传统的拉丁字母集'a'...'z')组成,至少有一个元音('a', 'e', 'i', 'o', 或者 'u'),至少两个辅音(除去元音以外的音节),并且有按字母表顺序出现的字母(例如,'abc'是有效的,而'bac'不是) 。
给定一个期望长度L和C个小写字母,写一个程序,打印出所有的长度为L、能由这些字母组成的有效密码。
密码必须按字母表顺序打印出来,一行一个。
题目名称:
passwd
输入格式:
* 第一行:
两个由空格分开的整数,L和C
* 第二行:
C个空格分开的小写字母,密码是由这个字母集中的字母来构建的。
输入样例 (文件 :
4 6
a t c i s w
输入详细说明:
由从给定的六个字母中选择的、长度为4的密码。
输出格式:
* 第一至行:
每一个输出行包括一个长度为L个字符的密码(没有空格)。
输出行必须按照字母顺序排列。
输出样例 (文件 :
acis
acit
aciw
acst
acsw
actw
aist
aisw
aitw
astw
cist
cisw
citw
istw
**********************************************************************
Problem 12:
"跳房子" [Hal Burch, 2005]
奶牛们按不太传统的方式玩起了小孩子们玩的"跳房子"游戏。
奶牛们创造了
一个5x5的、由与x,y轴平行的数字组成的直线型网格,而不是用来在里面跳
的、线性排列的、带数字的方格。
然后他们熟练地在网格中的数字中跳:
向前跳、向后跳、向左跳、向右跳
(从不斜过来跳),跳到网格中的另一个数字上。
他们再这样跳啊跳(按相同规
则),跳到另外一个数字上(可能是已经跳过的数字)。
一共在网格内跳过五次后,他们的跳跃构建了一个六位整数(可能以0开头,
例如000201)。
求出所有能被这样创造出来的不同整数的总数。
问题名称:
numgrid
输入格式:
* 第1到5行:
这样的网格,一行5个整数
输入样例 (文件 :
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1
输出格式:
* 第1行:
能构建的不同整数的总数
输出样例 (文件 :
15
输出详细说明:
111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112,121211, 121212, 211111, 211121, 212111和 212121 能够被构建。
没有其它可能的数了。
**********************************************************************
Problem 13:
卫星照片 [Rob Kolstad, 2005]
Farmer John给他的农场买了W x H像素的卫星照片(1 <= W <= 80, 1 <= H
<= 1000),希望找出最大的"连续的"(互相连接的)牧场。
任何一对像素,一个
像素如果能横向的或纵向的与属于这个牧场的另一个像素相连,这样的牧场称
作是连续的(这句话太难翻了,大家将就着理解一下,看了后面的范例应该不
会影响做题—译者)。
(很容易创建形状稀奇古怪的牧场,甚至是围着其它圆圈
的圆圈。
)
每一张照片都数字化的抽象了,牧场区显示为"*",非牧场区显示为"."。
下面
是一个10 x 5的卫星照片样例:
..*.....**
.**..*****
.*...*....
..****.***
..****.***
这张照片显示了大小分别为4、16、6个像素的连续牧场区。
帮助FJ在他的每张
卫星照片中找到最大的连续牧场。
问题名称:
satpix
输入格式:
* 第1行:
两个由空格分开的整数,H 和 W。
* 第2到H+1行:
每一行包含W个"*"或者".",代表卫星照片的横向行。
输出样例 (文件 :
10 5
..*.....**
.**..*****
.*...*....
..****.***
..****.***
输出格式:
* 第1行:
最大连续牧场的大小
输出样例 (文件 :
16