递归基础练习题Word文档下载推荐.docx
《递归基础练习题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《递归基础练习题Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
14.计算M=
max(a,b,c)/[max(a+b,b,c)*max(a,b,b+c)]其中a,b,c由键盘输入。
16.某人写了n封信和n个信封,如果所有的信都装错了信封。
求所有的信都装错信封共有多少种不同情况?
17.给出一棵二叉树的中序与后序排列。
求出它的先序排列。
18.求把一个整数n无序划分成k份互不相同的正整数之和的方法总数。
19.已知一个一维数组A[1..N]。
{N<
50}又已知一整数M。
如能使数组A中任意几个元素之和等于M,则输出YES,反之则为NO。
20.要求找出具有下列性质的数的个数(包含输
入的自然数n):
先输入一个自然数n(n<
=500),然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不
能超过原数首位数字的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
样例:
输入:
6满足条件的数为6
16
26
126
36
136输出:
6
21.自然数的拆分问题。
给定自然数n,将其拆分成若干自然数的和。
输出所有解,每组解中数字按从小到大排列。
相同数字的不同排列算一组解。
3=1+1+13=1+23=3
22.用递归的方法求N个数中最大的数及其位
置。
23.写出折半查找的递归算法。
24.快速排序法。
思考题:
1、数学宝塔,从最顶上走到最底层,每次只能
走到下一层的左边或右边的数字,求出使所走到
5
6
39
42
25
2、汉诺塔问题:
设有三个塔座,依次命名为
x,y,zo有z个直径不同的圆盘,由小到大依次编号为1、2、,n。
开始时,它们全部按递减
的次序插在塔座上。
现要求按下列规则把n个圆盘按次序插放在z塔座上。
(1)、每次只能移动一个圆盘;
(2)、圆盘可以从任一个塔座上移到另一个塔座上;
(3)、任何时刻都不能把一个较大的圆盘压在较
小的圆盘上。
典型例题:
1.设有n个数已经按从大到小的顺序排列,现在
从键盘上输入n,判断它是否在这n个数中,如果存在则输出“yes否则输出"
no”
Programlx4;
Constn=30;
Vara:
array[1..n]ofinteger;
F,r,x,k:
integer;
Programsearch(x,top,bot:
integer);
Varmid:
Begin
iftop<
=botthen
Mid=(top+bot)div2;
ye
Ifx=a[mid]thenwriteln(x:
5,mid:
5,s'
)
elseIfx<
a[mid]thensearch(x,top,mi
d-1)
Elsesearch(x,mid+1,r);
End
elseWriteln(x:
5,‘no'
);
End;
Writeln(‘inpnutgeshu'
Fork:
=1tondoread(a[k]);
Read(x);
F:
=1;
r:
=n;
Search(x,f,r);
End.
2.hanoi塔问题。
递归:
procedureHanoi(n:
x,y,z:
char);
Ifn=1thenwriteln(x,--'
n-,--'
z)
Elsebegin
Hanoi(n-1,x,z,y);
Writeln(x,--'
n-,--'
z;
)
Hanoi(n-1,y,x,z)
Write(‘inpunt:
'
);
Read(n);
Hanoi(n,'
A'
'
B'
C'
3.有n个硬币(n为偶数)正面朝上排成一排,每次将n-1个硬币翻成朝上为止。
编程让计算机把翻硬币的最简过程及翻币次数打印出来(用*代表正面,用0代表反面)。
基本形式:
D[1]=0;
d[2]=1
递归式:
d[n]=(n-1)*(d[n-1]+d[n-2])
varn:
functiond(n:
integer):
longint;
begin
casenof
1:
d:
=0;
2:
elsed:
=(n-1)*(d(n-1)+d(n-2));
end;
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;
functionfa(n:
3thenfa:
=1
elsefa:
=fa(n-1)+fa(n-2);
Thenumberoftherabbits:
fa(n));
end.
5.梯有N阶,上楼可以一步上一价,也可以一次上二阶。
编一个程序,计算共有多少种不同的走法。
s[n]=s[n-1]+s[n-2]
基本式子:
s[1]=1;
s[2]=2
programupstairs;
functions(n:
if(n=1)or(n=2)thens:
=n
elses:
=s(n-1)+s(n-2);
repeatwrite('
N='
untiln>
s='
s(n));
readln;
6.斐波那切数列
varm,p:
Functionfib(n:
Ifn=0thenfib:
=0
Elseifn=1thenfib:
Elsefib:
=fib(n-1)+fib(n-2);
Read(m);
P:
=fib(m);
Writeln(‘fib('
mm'
)='
p)
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:
ju:
boolean;
procedurecopy1(be,en:
jug:
q:
integer);
varm,t,ban:
ifjugthen
ifbe=1then
beginifs[en,en]=0then
begincopy1(be,endiv2,true,qdiv2);
copy1((endiv2)+1,en,false,qdiv2);
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)
=betoendofort:
=1toqdos[m+q,t+q]:
=s[m,t]endendelsebegin
ifs[be,q]=0then
=betoendo
=1toqdos[m-q,t+q]:
p:
=8;
fori:
=1tondo
forj:
s[i,j]:
begins[i,1]:
=i;
ifodd(i)thens[i+1,2]:
=s[i,1]elses[i-1,2]:
=s[i,1];
copy1(1,ndiv2,true,pdiv2);
copy1((ndiv2)+1,n,false,pdiv2);
=1tondowrite(s[i,j],'
writeln;
以下是USACOcontest上的题目,全是递归
*****************************************
*****************************
BRONZEPROBLEMS
三道题目,从11到13
Problem11:
谷仓的安保[Traditional,2005]FarmerJohn给谷仓安装了一个新的安全系统,并且要给牛群中的每一个奶牛安排一个有效的密码。
一个有效的密码由L(3<
=L<
=15)个小写字母(来自传统的拉丁字母集'
a'
...'
z'
)组成,至少有一个元音('
'
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
11121
*第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
最大连续牧场的大小输出样例(文件satpix.out):