递归基础练习题Word文档下载推荐.docx
《递归基础练习题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《递归基础练习题Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
10
5
16
8
4
STEP=16
13.
将十进制转换为二进制。
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),然后对此自然数按照如下方法进行处理:
①.
不作任何处理;
②.
在它的左边加上一个自然数,但该自然数不能超过原数首位数字的一半;
③.
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
样例:
输入:
6
满足条件的数为
16
26
126
36
136
输出:
21.
自然数的拆分问题。
给定自然数n,将其拆分成若干自然数的和。
输出所有解,每组解中数字按从小到大排列。
相同数字的不同排列算一组解。
3=1+1+1
3=1+2
3=3
22.
用递归的方法求N个数中最大的数及其位置。
23.
写出折半查找的递归算法。
24.
快速排序法。
思考题
:
1、数学宝塔,从最顶上走到最底层,每次只能走到下一层的左边或右边的数字,求出使所走到的所有数字之和为60的途径。
7
4 6
6 9 3
6 3 7 1
2 5 3 2 8
5 9 4 7
3 2
6 4 1 8 5 6 3
3 9 7 6 8 4 1 5
2 5 7 3 5 7 8 4 2
2、
汉诺塔问题:
设有三个塔座,依次命名为x,y,z。
有z个直径不同的圆盘,由小到大依次编号为1、2、……,n。
开始时,它们全部按递减的次序插在塔座上。
现要求按下列规则把n个圆盘按次序插放在z塔座上。
(1)、每次只能移动一个圆盘;
(2)、圆盘可以从任一个塔座上移到另一个塔座上;
(3)、任何时刻都不能把一个较大的圆盘压在较小的圆盘上。
典型例题:
1.设有n个数已经按从大到小的顺序排列,现在从键盘上输入n,判断它是否在这n
个数中,如果存在则输出“yes”否则输出“no”。
Program
lx4;
Const
n=30;
Var
a:
array[1..n]of
integer;
F,r,x,k:
search(x,top,bot:
integer);
mid:
Begin
if
top<
=bot
then
Mid=(top
+
bot)
div
2;
If
x
=a[mid]
then
writeln(x:
5,mid:
5,’yes’)
else
x<
a[mid]
search(x,top,mid-1)
Else
search(x,mid+1,r);
End
Writeln(x:
5,‘no’);
End;
Begin
Writeln(‘input
n
ge
shu’);
For
k:
=1
to
do
read(a[k]);
Read(x);
F:
=1;
r:
=n;
Search(x,f,r);
End.
塔问题。
递归:
procedure
Hanoi(n:
x,y,z:
char);
n=1
writeln(x,’--’n,’---’,z)
begin
Hanoi(n-1,x,z,y);
Writeln(x,’--’,n,’---’,z);
Hanoi(n-1,y,x,z)
Write(‘input
n:
’);
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])
var
function
d(n:
integer):
longint;
begin
case
of
1:
d:
=0;
2:
else
=(n-1)*(d(n-1)+d(n-2));
end;
end;
begin
repeat
write('
n='
);
readln(n);
if
n<
=0
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
fa(n:
fa:
=1
else
=fa(n-1)+fa(n-2);
readln(n);
The
number
of
the
rabbits:
fa(n));
end.
5.梯有N阶,上楼可以一步上一价,也可以一次上二阶。
s[n]=s[n-1]+s[n-2]
基本式子:
s[1]=1;
s[2]=2
upstairs;
s(n:
(n=1)or(n=2)
s:
=n
else
=s(n-1)+s(n-2);
repeat
N='
until
s='
s(n));
6.斐波那切数列
m,p:
Function
fib(n:
n=0
fib:
=0
=fib(n-1)+fib(n-2);
Read(m);
P:
=fib(m);
Writeln(‘fib(’,mm’)=’,p)
7.设有2^n个运动员要进行网球比赛。
现要设计一个满足以下要求的比赛日程表:
(1)、每个选手必须与其他n-1个选手各赛一次;
(2)、每个选手每天只能参赛一次;
(3)、循环赛在n-1天内结束。
match;
const
k=3;
n=8;
var
s:
array[1..n,1..n]
i,j,p:
ju:
boolean;
procedure
copy1(be,en:
jug:
q:
var
m,t,ban:
jug
begin
if
be=1
begin
s[en,en]=0
begin
copy1(be,en
2,true,q
2);
copy1((en
2)+1,en,false,q
end;
for
m:
en
do
for
t:
s[m+q,t+q]:
=s[m,t]
end
begin
s[be+q-1,q]=0
begin
copy1(be,be+(q
2)-1,true,q
copy1(be+(q
2),en,false,q
2)
end;
for
=be
for
q
s[m+q,t+q]:
end
end
if
s[be,q]=0
copy1(be+(q
end;
for
s[m-q,t+q]:
p:
=8;
for
i:
for
j:
s[i,j]:
begin
s[i,1]:
=i;
if
odd(i)
s[i+1,2]:
=s[i,1]
s[i-1,2]:
=s[i,1];
copy1(1,n
2,true,p
copy1((n
2)+1,n,false,p
for
write(s[i,j],'
writeln;
end.
以下是USACO
contest上的题目,全是递归
-----------------------------------------------
**********************************************************************
BRONZE
PROBLEMS
三道题目,从11到13
Problem
11:
谷仓的安保
[Traditional,
2005]
Farmer
John给谷仓安装了一个新的安全系统,并且要给牛群中的每一个奶牛安排一个有效的密码。
一个有效的密码由L(3
<
=
L
15)个小写字母(来自传统的拉丁字母集'
a'
...'
z'
)组成,至少有一个元音('
e'
i'
o'
或者
u'
),至少两个辅音(除去元音以外的音节),并且有按字母表顺序出现的字母(例如,'
abc'
是有效的,而'
bac'
不是)
。
给定一个期望长度L和C个小写字母,写一个程序,打印出所有的长度为L、能由这些字母组成的有效密码。
密码必须按字母表顺序打印出来,一行一个。
题目名称:
passwd
输入格式:
*
第一行:
两个由空格分开的整数,L和C
第二行:
C个空格分开的小写字母,密码是由这个字母集中的字母来构建的。
输入样例
(文件
a
t
c
i
s
w
输入详细说明:
由从给定的六个字母中选择的、长度为4的密码。
输出格式:
第一至行:
每一个输出行包括一个长度为L个字符的密码(没有空格)。
输出行必须按照字母顺序排列。
输出样例
acis
acit
aciw
acst
acsw
actw
aist
aisw
aitw
astw
cist
cisw
citw
istw
12:
"
跳房子"
[Hal
Burch,
奶牛们按不太传统的方式玩起了小孩子们玩的"
游戏。
奶牛们创造了
一个5x5的、由与x,y轴平行的数字组成的直线型网格,而不是用来在里面跳
的、线性排列的、带数字的方格。
然后他们熟练地在网格中的数字中跳:
向前跳、向后跳、向左跳、向右跳
(从不斜过来跳),跳到网格中的另一个数字上。
他们再这样跳啊跳(按相同规
则),跳到另外一个数字上(可能是已经跳过的数字)。
一共在网格内跳过五次后,他们的跳跃构建了一个六位整数(可能以0开头,
例如000201)。
求出所有能被这样创造出来的不同整数的总数。
问题名称:
numgrid
第1到5行:
这样的网格,一行5个整数
第1行:
能构建的不同整数的总数
15
输出详细说明:
111111,
111112,
111121,
111211,
111212,
112111,
112121,
121111,
121112,121211,
121212,
211111,
211121,
212111和
212121
能够被构建。
没有其它可能的数了。
13:
卫星照片
[Rob
Kolstad,
John给他的农场买了W
H像素的卫星照片(1
W
80,
H
1000),希望找出最大的"
连续的"
(互相连接的)牧场。
任何一对像素,一个
像素如果能横向的或纵向的与属于这个牧场的另一个像素相连,这样的牧场称
作是连续的(这句话太难翻了,大家将就着理解一下,看了后面的范例应该不
会影响做题—译者)。
(很容易创建形状稀奇古怪的牧场,甚至是围着其它圆圈
的圆圈。
每一张照片都数字化的抽象了,牧场区显示为"
*"
非牧场区显示为"
."
下面
是一个10
5的卫星照片样例:
..*.....**
.**..*****
.*...*....
..****.***
这张照片显示了大小分别为4、16、6个像素的连续牧场区。
帮助FJ在他的每张
卫星照片中找到最大的连续牧场。
satpix
两个由空格分开的整数,H
和
W。
第2到H+1行:
每一行包含W个"
或者"
,代表卫星照片的横向行。
5
最大连续牧场的大小