递归与递推

递归与递推
递归与递推

2.1 遍历问题

【问题描述】

我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:

所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。

【输入】

输入数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。

【输出】

输出可能的中序遍历序列的总数,结果不超过长整型数。

【样例】

travel.in

abc

cba

travel.out

4

2.2 产生数

【问题描述】

给出一个整数n(n<1030)和m个变换规则(m≤20)。

约定:一个数字可以变换成另一个数字,规则的右部不能为零,即零不能由另一个数字变换而成。而这里所说的一个数字就是指一个一位数。

现在给出一个整数n和m个规则,要你求出对n的每一位数字经过任意次的变换(0次或多次),能产生出多少个不同的整数。

【输入】

共m+2行,第一行是一个不超过30位的整数n,第2行是一个正整数m,接下来的m 行是m个变换规则,每一规则是两个数字x、y,中间用一个空格间隔,表示X可以变换成Y。

【输出】

仅一行,表示可以产生的不同整数的个数。

【样例】

build.in

1 2 3

2

1 2

2 3

build.out

6

2.3 出栈序列统计

【问题描述】

栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数。

【输入】

就一个数n(1≤n≤1000)。

【输出】

一个数,即可能输出序列的总数目。

【样例】

stack.in

3

stack.out

5

2.4 计数器

【问题描述】

一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9。其中一个页码不含多余的0,如N=1234时第5页不是0005,只是5。

【输入】

一个正整数N(N≤109),表示总的页码。

【输出】

共十行:第k行为数字k-1的个数。

【样例】

count.in

11

count.Out

1

4

1

1

1

1

1

1

1

1

2.5 诸侯安置

【问题描述】

很久以前,有一个强大的帝国,它的国土成正方形状,如图2 2所示。

这个国家有若干诸侯。由于这些诸侯都曾立下赫赫战功,国王准备给他们每人一块封地(正方形中的一格)。但是,这些诸侯又非常好战,当两个诸侯位于同一行或同一列时,他们就会开战。如下图2-3为n=3时的国土,阴影部分表示诸侯所处的位置。前两幅图中的诸侯可以互相攻击,第三幅则不可以。

国王自然不愿意看到他的诸侯们互相开战,致使国家动荡不安。因此,他希望通过合理的安排诸侯所处的位置,使他们两两之间都不能攻击。

现在,给出正方形的边长n,以及需要封地的诸侯数量k,要求你求出所有可能的安置方案数。(n≤100,k≤2n2-2n+1)

由于方案数可能很多,你只需要输出方案数除以504的余数即可。

【输入】

仅一行,两个整数n和k,中间用一空格隔开

【输出】

一个整数,表示方案数除以504的余数。

【样例】

empire.in

2 2

empire.out

4

【样例说明】

四种安置方案如图2-4所示。注意:镜面和旋转的情况属于不同的方案。

2.6 括号序列

【问题描述】

定义如下规则序列(字符串):

1.空序列是规则序列;

2.如果S是规则序列,那么(S)和[s]也是规则序列;

3.如果A和B都是规则序列,那么AB也是规则序列。

例如,下面的字符串都是规则序列:

(),[],(()),([]),()[],()[()]

而以下几个则不是:

(,[,],)(,()),([()

现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是找出一个最短规则序列,使得给你的那个序列是你给出的规则序列的子列。(对于序列a1,a2,…,a n和序列b1,b2,…,b n,如果存在一组下标1≤i1

【输入】

输入文件仅一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,长度不超过100 【输出】

输出文件也仅有一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,把你找到的规则序列输出即可。因为规则序列可能不止一个,因此要求输出的的规则序列中嵌套的层数尽可能地少。

【样例】

bracket.in

([()

bracket.out

()[]() {最多的嵌套层数为1,如层数为2时的一种为()[()])

2.7 新汉诺塔

【问题描述】

设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A、B、C,这个状态称为初始状态。

现在要求找到一种步数最少的移动方案,使得从初始状态转变为目标状态。

移动时有如下要求:

◆一次只能移一个盘;

◆不允许把大盘移到小盘上面。

【输入】

文件第一行是状态中圆盘总数;

第二到第四行分别是初始状态中A、B、C柱上圆盘的个数和从下到上每个圆盘的编号;

第五到第七行分别是目标状态中A、B、C柱上圆盘的个数和从下到上每个圆盘的编号。【输出】

每行一步移动方案,格式为:move I from P to Q

最后一行输出最少的步数。

【样例】

Hanoi.in

5

3 3 2 1

2 5 4

1 2

3 5

4 3

1 1

Hanoi.out

move 1 from A to B

move 2 from A to C

move 1 from B to C

move 3 from A to B

move 1 from C to B

move 2 from C to A

move 1 from B to C

7

2.8 排序集合

【问题描述】

对于集合N={1,2,…,n}的子集,定义一个称之为“小于”的关系:

设S1={X1,X2,…,X i},(x1

你的任务是,对于任意的n(n≤31)及k(k<2n),求出第k小的子集。

【输入】

输入文件仅一行,包含两个用空格隔开的自然数,n和k。

【输出】

输出文件仅一行,是该子集的元素,由小到大排列。空集输出0。

【样例】

sort.in

sort.out

1 2 3

2.9 青蛙过河

【问题描述】

有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k 个荷叶(c区),还有h个石墩(D区),右边有一个石墩(B区),如下图2-5所示。n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为:

(1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小);

(2)青蛙可以:A-B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,c→D;

(3)当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面。

【你的任务】

给出h,k,输出最多能有多少只青蛙可以根据以上规则顺利过河?

【样例】

frog.in

2 3 {河中间有2个石墩,3个荷叶)

frog.out

16 {最多有16只青蛙可以按照规则过河}

2.10 电话号码

【问题描述】

电话机上每一个数字下面都写了若干个英文字母。分布如下:

1~abc

2~def

3~ghi

4~jkl

5~mn

6~opq

7~rst

8~uvw

9~xyz

现在给定一个单词表和一串数字密码,请你用单词表中的单词翻译这个密码。

【输入】

第一行为一个正整数N表示单词表中单词的个数(N≤100);

第二行为一个长度不超过100的数字串,表示密码;

接下来的N行,每行一个长度不超过20的单词,表示单词表。

【输出】

仅一行,表示翻译后的原文,如果密码无法翻译,则输出“No Solutions!”,如果密码有多种翻译方式,则输出任意一种即可。

【样例】

phone.in

73373711664

thi

shs

this

is

b

a

boo

k

phone.out

thi shs b boo k

2.1l 编码

【问题描述】

编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。

字母表中共有26个字母{a,b,…,z},这些特殊的单词长度不超过6且字母按升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。

例如:

a→1

b→2

z→26

ab→27

ac→28

你的任务就是对于所给的单词,求出它的编码。

【输入】

仅一行,被编码的单词。

【输出】

仅一行,对应的编码。如果单词不在字母表中,输出0。

【样例】

encode.in

ab

encode.out

27

《递归算法与递归程序》教学设计

递归算法与递归程序 岳西中学:崔世义一、教学目标 1知识与技能 (1) ?认识递归现象。 (2) ?使用递归算法解决冋题往往能使算法的描述乘法而易于表达 (3) ?理解递归三要素:每次递归调用都要缩小规模;前次递归调用为后次作准备:递归调用必须有条件进行。 (4) ?认识递归算法往往不是咼效的算法。 (5) ? 了解递归现象的规律。 (6) ?能够设计递归程序解决适用于递归解决的问题。 (7) ?能够根据算法写出递归程序。 (8) ? 了解生活中的递归现象,领悟递归现象的既有重复,又有变化的特点,并且从中学习解决问题的一种方法。 2、方法与过程 本节让同学们玩汉诺塔的游戏,导入递归问题,从用普通程序解决斐波那契的兔子问题入手,引导学生用自定义了一个以递归方式解决的函数过程解决问题,同时让同学们做三个递归练习,巩固提高。然后让学生做练习(2) 和练习(3)这两道题目的形式相差很远,但方法和答案却是完全相同的练习,体会其中的奥妙,加深对递归算法的了解。最后用子过程解决汉诺塔的经典问题。 3、情感态度和价值观 结合高中生想象具有较强的随意性、更富于现实性的身心发展特点,综合反映出递归算法的特点,以及递归算法解答某些实践问题通常得很简洁,从而激发学生对程序设计的追求和向往。 二、重点难点 1、教学重点 (1) 了解递归现象和递归算法的特点。 (2) 能够根据问题设计出恰当的递归程序。 2、教学难点 (1) 递归过程思路的建立。 (2) 判断冋题是否适于递归解法。 (3) 正确写出递归程序。 三、教学环境 1、教材处理 教材选自《浙江省普通高中信息技术选修:算法与程序设计》第五章,原教材的编排是以本节以斐波那契的兔子问题引人,导出递归算法,从而自 定义了一个以递归方式解决的函数过程。然后利用子过程解决汉诺塔的经典问题。 教材经处理后,让同学们玩汉诺塔的游戏,导入递归问题,从用普通程序解决斐波那契的兔子问题入手,引导学生用自定义了一个以递归方式解决的函数过程解决问题,同时让同学们做三个递归练习,巩固提高。然后让学生做练习⑵ 和练习

高中信息技术 算法与程序设计-递归算法的实现教案 教科版

递归算法的实现 【基本信息】 【课标要求】 (三)算法与问题解决例举 1. 内容标准 递归法与问题解决 (1)了解使用递归法设计算法的基本过程。 (2)能够根据具体问题的要求,使用递归法设计算法、编写递归函数、编写程序、求解问题。 【教材分析】 “算法的程序实现”是《算法与程序设计》选修模块第三单元的内容,本节课是“递归算法的程序实现”,前面学习了用解析法解决问题、穷举法解决问题、在数组中查找数据、对数进行排序以及本节的前一小节知识点“什么是自定义函数”的学习,在学习自定义函数的基础上,学习递归算法的程序实现是自定义函数的具体应用,培养学生“自顶向下”、“逐步求精”的意识起着重要的作用。 『递归算法在算法的学习过程中是一个难点,在PASCAL和C语言等程序语言的学习过程中,往往是将其放在“函数与过程”这一章节中来讲解的。递归算法的实现也是用函数或是过程的自我调用来实现的。从这一点上来讲,作者对教材的分析与把握是准确的,思路是清晰的,目标是明确的。』 【学情分析】 教学对象是高中二年级学生,前面学习了程序设计的各种结构,在学习程序设计各种结构的应用过程中培养了用计算机编程解决现实中问题的能力,特别是在学习循环语句的过程中,应用了大量的“递推”算法。前一节课学习了如何自定义函数,在此基础上学习深入学习和体会自定义函数的应用。以递推算法的逆向思维进行求解问题,在学习过程中体会递归算法的思想过程。多维度的思考问题和解决问题是提高学生的学习兴趣关键。 『递归算法的本质是递推,而递推的实现正是通过循环语句来完成的。作者准确把握了学生前面的学习情况,对递归算法的本质与特征也分析的很透彻,可以说作者对教学任务的分析是很成功的,接来就要看,在成功分析的基础上作者是如何通过设计教学来解决教学难点的了。』 【教学目标】

递归方程求解方法综述

递归方程求解方法综述 摘要:随着计算机科学的逐步发展,各种各样的算法相继出现,我们需要对算法进行分析,以选择性能更好的解决方案。算法分析中计算复杂度常用递归方程来表达,因此递归方程的求解有助于分析算法设计的好坏。阐述了常用的3种求解递归方程的方法:递推法、特征方程法和生成函数法。这3种方法基本上可以解决一般规模递归方程的求解问题。 关键词:递归;递推法;特征方程;生成函数 0引言 寻求好的解决方案是算法分析的主要目的,问题的解决方案可能不只一个,好的方案应该执行时间最短,同时占有存储空间最小,故算法分析一般考虑时间复杂性、空间复杂性两方面的参数。在算法分析时我们采用时间耗费函数来表示时间参数,用当问题规模充分大时的时间耗费函数的极限表示时间复杂度。 一般算法对应的时间耗费函数常用递归方程表示,找出递归方程的解,就可以表示其对应算法复杂度的渐进阶,从而比较算法的优劣。因此研究递归方程的解法意义重大。下文将分析并给出常用递归方程的3种解法。 1递归方程的解法 递归方程是对实际问题求解的一种数学抽象,递归的本质在于将原始问题逐步划分成具有相同解题规律的子问题来解决,原始问题与子问题仅在规模上有大小区别,并且子问题的规模比原始问题的

规模要小。对于规模为n的原始问题,我们通常会寻找规模n的问题与规模n-1或者规模n/2的问题之间存在的联系,从而进一步推导出具有递归特性的运算模型。 根据递归方程的一般形式,常用的解法有三种,分别是递推法、公式法及生成函数法。下面就分别来分析其求解过程。 1.1递推法 当递归方程形式简单且阶数较低时,一般可以采用递推法求解,根据一步一步递推找到方程的递推规律,得到方程的解。下面举例说明: t(1)=0 t(n)=2t(n/2)+n2(n≥2) t(n)=2t(n/2)+n2=2(2t(n/22)+(n/2)2)+n2 =22t(n/2)2+2n2/22+n2 =22(2t(n/23)+(n/22)2)+2n2/22+n2 =23(2t(n/23)+22n2/(22)2)+2n2/(22)1+n2… =2kt(n/2k)+∑k-1i=02in2(22)i递推到这里我们就可以发现递 归规律,找到递归出口, t(1)=0,令n=2k 则可以得到如下结果:t(n) =2kt(1) +∑k-1i=0n2(1/2)i)= n2(1-(1/2)k1-1/2)=2n2-2n 上面得到方程的解,我们来分析其对应算法复杂性的渐进阶,根据渐进阶定理有:设有函数f(n),g(n)均是规模n的函数,则o(f(n))+o(g(n))=o(max(f(n), g(n)))。故有t(n)=o(n2)。 1.2公式法

关于递归与递推的那七道题

关于递归与递推的那七道题 递归与递推是动态规划最底层的东西,掌握好它对于彻底的理解动规是至关重要的,这次做的题不难,但是它很能锻练人的思维,每一道题都有多种解法。只要静下心来想,一般人都能做出来,而在做题的过程中,你会有很大的收获。 1、一只小蜜蜂... 题目是这样的,有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。 对于这种题目,我们首先得找出蜂房之间的关系,如从1只能走到2和3,从2只能走到3和4,从3只能走到4和5……,因此 我们可以得到它们的递推关系: f[a] = f[a+1]+f[a+2]; 下面我们再来找出口,把这个问题化简,即当a与b相邻时(a+1=b 或a+2=b),f[a] = 1,所以这个问题可以解决了。它就是一个递归,遇到b就结束。为了减少重复访问,我们可以用记忆化搜索来提高效率。 这个题也可以顺着来推,即从a到a有0条路线,从a到a+1有1条路线,从a 到a+2有1条路线,而a+3的路线条数来源于a+1 和a+2的路径条数。 f[a] = 0; f[a+1] = 1; f[a+2] = 1; f[a+3] = f[a+1]+f[a+2]; …… f[b] = f[b-1]+f[b-2]; 由上面的式子就可以看出,它就是一个菲波拉契数列。 2、LELE的RPG难题

题目描述:有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法. 以上就是著名的RPG难题. 解法一: 这个题目经过同学们的讨论,得出了三种解法。我所用的方法还是搜索,我们先不考虑它的限制条件,把第一个格子看成是树的根,那么总共可以建成三棵树,每一棵树的结点都有三个孩子。我们的目标就是要统计这三棵树中分别从根结点走到叶子结点的总的路径条数。然后把限制条件加上,把不符合要求的路径去掉,即可得出最终的结果。具体的做法同样是记忆化搜索. 解法二:递推公式 f[n] = 3 * 2^(n-1) – f[n-1]; 解法三:数学公式 f[n] = (k-1)^n+(k-1)*(-1)^n; 证明略。 3、骨牌铺方格 题目描述:在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 法一: 这道题目,我是用数学方法解的,可以说是枚举。骨牌放入方格中只有两种方式,横放或竖放,设横放的有x张,竖放的有y张。则X+y = n;并且x只能是偶数(要把方格填满,横着放的骨牌只能是成对出现),而题目给出n最大为50,所x,y 完全可以很快的枚举 出来。剩下的工作只需对由x/2,y组成的多重集合进行排列就行了。这个集合中共有两类不同类型的元素,第一类元素的重数k1=x/2, 第二类元素的重数k2=y;故最后的结果为(k1+k2)!/(k1! * k2!)。 法二: 假设f[n]为铺放方案的总数,我们只考虑最后放的那几张骨牌,有两种可能,一种是只放一张,竖着放,此时的方案总数为f[n-1],还有 一种可能是放两张,横着放,此时的方案总数为f[n-2]。因此我可以得出递推公式 f[n] = f[n-1]+f[n-2]。 法三:

递推与递归练习题

练习 1.(用递归做)5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大? 程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。 2.(用递归做)商人渡河问题是这样的:有三个商人,三个强盗,和一条船(船 每次只可以载小于等于两个人)他们同在河的一边,想渡过河去,但是必须保证在河的任何一边必须保证商人的数目大于等于强盗的数目,应该怎么过这条河呢? 注意:开始时商人,强盗所在的河的这边设为0状态,另一边设为1状态(也就是船开始时的一边设为0,当船驶到对岸是设为1状态,在这两个状态时,都必须符合条件) 3.(用递推做)猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾, 又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 以后每天早上都吃了前一天剩下的一半多一个。到第30天早上想再吃时,见只剩下1个桃子了。求第一天共摘了多少。 4.(用递推做)已知一对兔子每一个月能生一对小兔子,而一对小兔子出 生后第二个月就开始生小兔子,假如一年内没有发生死亡,则以对兔子一年能繁殖成多少对?

答案: 1.#include int age(int n) { if(n==1) return(10); else return age(n-1)+2; } void main() { int n; n=5; printf("The fifth age is %d.\n",age(n)); } 2.#include #include #include struct node /*建立一个类似栈的数据结构并且可以浏览每一个数据点*/ { int x; int y; int state; struct node *next; }; typedef struct node state; typedef state *link; link PPointer1=NULL; link PPointer2=NULL; int a1,b1; int a2,b2; /*栈中每个数据都分为0,1状态*/ void Push(int a,int b,int n) { link newnode; newnode=(link)malloc(sizeof(state)); newnode-> x=a; newnode-> y=b; newnode-> state=n; newnode-> next=NULL; if(PPointer1==NULL) { PPointer1=newnode; PPointer2=newnode; }

《算法设计与分析》递归算法典型例题

算法递归典型例题 实验一:递归策略运用练习 三、实验项目 1.运用递归策略设计算法实现下述题目的求解过程。 题目列表如下: (1)运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。 (2)国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i 个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份? 源程序: (3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼? (4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少? (5)猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子? (6)小华读书。第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少页? (7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子? 四、实验过程 (一)题目一:…… 1.题目分析 由已知可得,运动会最后一天剩余的金牌数gold等于运动会举行的天数由此可倒推每一 天的金牌剩余数,且每天的金牌数应为6的倍数。 2.算法构造 设运动会举行了N天, If(i==N)Gold[i]=N; Else gold[i]=gold[i+1]*7/6+i;

递推和递归作业

题1:编码(encode.???) 【问题描述】 编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。 字母表中共有26个字母{a,b,……,z},这些特殊的单词长度不超过6且字母按升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。 例如: a --> 1 b --> 2 z --> 26 ab --> 27 ac --> 28 你的任务就是对于所给的单词,求出它的编码。 【输入格式】 仅一行,被编码的单词。 【输出格式】 仅一行,对应的编码。如果单词不在字母表中,输出0。 【输入样例】 ab 【输出样例】 27 题2:特殊的子集(subset.???) 【问题描述】 集合M={1,2,3,……n}的子集中,有一些是不含相邻自然数元素的。例如:n=4时,集合{1,3}是满足要求的,而{1,3,4}是不满足的,因为它含有相邻自然数3和4。把所有满足要求的子集记作S i,对于每一个S i计算出它的所有元素的乘积T i,求∑T i2。 【输入格式】 仅一行,包括一个正整数n(n≤100) 【输出格式】 仅一行,即T i的平方和,可能会超出长整型范围。 【输入样例】 4

【输出格式】 119 题3:素数环(prime.???) 【问题描述】 给定一个n,求1..n组成的环,使得环上相邻的元素和为素数。 【输入格式】 n(1<=n<=10) 【输出格式】 把1放在第一位置,按照字典顺序不重复的输出所有解(顺时针,逆时针算不同的两种),相邻两数之间严格用一个整数隔开,每一行的末尾不能有多余的空格。 【输入样例】 8 【输出样例】 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 题4:火力网(fire.???) 【问题描述】 在一个n*n的阵地中,有若干炮火不可摧毁的石墙,现在要在这个阵地中的空地上布置一些碉堡。假设碉堡只能向上下左右四个方向开火,由于建筑碉堡的材料挡不住炮火,所以任意一个碉堡都不能落在其它碉堡的火力范围内,请问至多可建造几座碉堡? 【输入格式】 第一行一个整数n(n<=10)。 下面n行每行为一个由n个字符构成的字符串,表示阵地的布局,包括空地('.'),和石墙('X')。 【输出格式】 一个整数,即最多可建造的碉堡数。 【输入样例】 4

c++,使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现5

实验九 一、实验内容 教材3.9 定义递归函数实现下面的Ackman函数 n+1 m=0 Acm(m,n)= Acm(m-1,1) n=0 Acm(m-1,Acm(m,n-1)) n>0,m>0 教材3.10 用递归法实现勒让德多项式: 1 n=0 Pn= x n=1 ((2n-1)xPn-1(x)-(n-1)Pn-2(x))/n 教程p24 使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现 教程p26 编程:将上题以多文件方式组织,在area.h中声明各个area()函数原型,在area.cpp文件中定义函数,然后在Exp9_2中包含area.h,定义main() 函数并执行。 二、实验目的 1、掌握函数的嵌套调用好递归调用 2、掌握递归算法 3、了解内联函数、重载函数、带默认参函数的定义及使用方法 4、掌握程序的多文件组织 5、掌握编译预处理的内容,理解带参数宏定义与函数的区别 三、实验步骤 教材3.9 定义递归函数实现下面的Ackman函数 n+1 m=0 Acm(m,n)= Acm(m-1,1) n=0 Acm(m-1,Acm(m,n-1)) n>0,m>0 教材3.10用递归法实现勒让德多项式: 1 n=0 Pn= x n=1 ((2n-1)xPn-1(x)-(n-1)Pn-2(x))/n 教程p24 使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现 教程p26 编程:将上题以多文件方式组织,在area.h中声明各个area()函数原型,在area.cpp文件中定义函数,然后在Exp9_2中包含area.h,定义main() 函数并执行。 四、实验数据及处理结果

使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告

《算法设计与分析》 课程设计报告 题目:循环赛日程表 院(系):信息科学与工程学院 专业班级:软工 学生姓名: 学号: 指导教师: 2018 年 1 月 8 日至 2018 年 1 月 19 日

算法设计与分析课程设计任务书

目录 1 常用算法 (1) 1.1分治算法 (1) 基本概念: (1) 1.2递推算法 (2) 2 问题分析及算法设计 (5) 2.1分治策略递归算法的设计 (5) 2.2 分治策略非递归算法的设计 (7) 2.3 递推策略算法的设计 (8) 3 算法实现 (9) 3.1分治策略递归算法的实现 (9) 3.2 分治策略非递归算法的实现 (10) 3.3 递推策略算法的实现 (12) 4 测试和分析 (15) 4.1分治策略递归算法测试 (15) 4.2分治策略递归算法时间复杂度的分析 (16) 4.3 分治策略非递归算法测试 (16) 4.4分治策略非递归算法时间复杂度的分析 (17) 时间复杂度为:O(5^(n-1)) (17) 4.5 递推策略算法测试 (17) 4.6 递推策略算法时间复杂度的分析 (18) 时间复杂度为:O(5^(n-1)) (18) 4.7 三种算法的比较 (18) 5 总结 (19) 参考文献 (20)

1 常用算法 1.1分治算法 基本概念: 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算。n=2时,只要作一次比较即可排好序。n=3时只要作3次比较即可,…。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。 基本思想及策略: 分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。 如果原问题可分割成k个子问题,1

Problem_递推递归与贪心_

长郡中学NOIP递推递归贪心试题 试题名称程序名输入文件输出文件时限空间铺砖问题puzhuan. cpp puzhuan.in puzhuan.out 1s 128M 三角形计数TricountUVa. cpp TricountUVa.in TricountUVa.out 1s 128M 新汉诺塔Hanoi.cpp Hanoi.in Hanoi.out 1s 128M 生产调度 prod .cpp prod.in prod.out 1s 128M 最大乘积 maxmul.cpp maxmul.in maxmul.out 1s 128M 铺砖 【问题描述】 用1 x 1和2 x 2的磁砖不重叠地铺满N x 3的地板,共有多少种方案? 【输入】 仅一行包含一个正整数 N ( 1 <= N <= 1000 )。 【输出】 一行包含一个整数表示方案数,由于结果可能很大,你只需要输出这个答案mod 12345的值。 【样例】 puzhuan.in 2 puzhuan.out 3

三角形计数 【问题描述】 有多少种方法可以从1,2,3...,n中选3个不同的整数。使得以它们为三边长可以组成三角形? 比如n=5时有3种方法(2,3,4),(2,4,5),(3,4,5).n=8时有22种方法。 【输入】 输入包含多组测试数据,每组测试数据为一行整数n(3≤n≤1 000 000)。输入用n<3的标志结束。 【输出】 对于每组数据,输出其方案数(每组占一行) 【样例】 TricountUVa. IN 5 8 1 TricountUVa. OUT 3 22 数据组数不会超过20组。 对于25%的数据:(3≤n≤100) 对于50%的数据:(3≤n≤1 000) 对于100%的数据:(3≤n≤1 000 000)

《递归算法与递归程序》教学设计

递归算法与递归程序 岳西中学:崔世义 一、教学目标 1、知识与技能 (1).认识递归现象。 (2).使用递归算法解决问题往往能使算法的描述乘法而易于表达 (3).理解递归三要素:每次递归调用都要缩小规模;前次递归调用为后次作准备:递归调用必须有条件进行。 (4).认识递归算法往往不是高效的算法。 (5).了解递归现象的规律。 (6).能够设计递归程序解决适用于递归解决的问题。 (7).能够根据算法写出递归程序。 (8).了解生活中的递归现象,领悟递归现象的既有重复,又有变化的特点,并且从中学习解决问题的一种方法。 2、方法与过程 本节让同学们玩汉诺塔的游戏,导入递归问题,从用普通程序解决斐波那契的兔子问题入手,引导学生用自定义了一个以递归方式解决的函数过程解决问题,同时让同学们做三个递归练习,巩固提高。然后让学生做练习(2)和练习(3)这两道题目的形式相差很远,但方法和答案却是完全相同的练习,体会其中的奥妙,加深对递归算法的了解。最后用子过程解决汉诺塔的经典问题。 3、情感态度和价值观 结合高中生想象具有较强的随意性、更富于现实性的身心发展特点,综合反映出递归算法的特点,以及递归算法解答某些实践问题通常得很简洁,从而激发学生对程序设计的追求和向往。 二、重点难点 1、教学重点 (1)了解递归现象和递归算法的特点。 (2)能够根据问题设计出恰当的递归程序。 2、教学难点 (1)递归过程思路的建立。 (2)判断问题是否适于递归解法。 (3)正确写出递归程序。 三、教学环境 1、教材处理 教材选自《浙江省普通高中信息技术选修:算法与程序设计》第五章,原教材的编排是以本节以斐波那契的兔子问题引人,导出递归算法,从而自定义了一个以递归方式解决的函数过程。然后利用子过程解决汉诺塔的经典问题。 教材经处理后,让同学们玩汉诺塔的游戏,导入递归问题,从用普通程序解决斐波那契的兔子问题入手,引导学生用自定义了一个以递归方式解决的函数过程解决问题,同时让同学们做三个递归练习,巩固提高。然后让学

递推-递归-分治-回溯

递推算法 在程序编辑过程中,我们可能会遇到这样一类问题,出题者告诉你数列的前几个数,或通过计算机获取了数列的前几个数,要求编程者求出第N项数或所有的数列元素(如果可以枚举的话),或求前N项元素之和。这种从已知数据入手,寻找规则,推导出后面的数的算法,称这递推算法。 典型的递推算法的例子有整数的阶乘,1,2,6,24,120…,a[n]=a[n-1]*n(a[1]=1);前面学过的2n,a[n]=a[n-1]*2(a[1]=1),菲波拉契数列:1,2,3,5,8,13…,a[n]=a[n-1]+a[n-2](a[1]=1,a[2]=2)等等。 在处理递推问题时,我们有时遇到的递推关系是十分明显的,简单地写出递推关系式,就可以逐项递推,即由第i项推出第i+1项,我们称其为显示递推关系。但有的递推关系,要经过仔细观察,甚至要借助一些技巧,才能看出它们之间的关系,我们称其为隐式的递推关系。 下面我们来分析一些例题,掌握一些简单的递推关系。 例如阶梯问题:题目的意思是:有N级阶梯,人可以一步走上一级,也可以一步走两级,求人从阶梯底走到顶端可以有多少种不同的走法。 这是一个隐式的递推关系,如果编程者不能找出这个递推关系,可能就无法做出这题来。我们来分析一下:走上第一级的方法只有一种,走上第二级的方法却有两种(两次走一级或一次走两级),走上第三级的走法,应该是走上第一级的方法和走上第二级的走法之和(因从第一级和第二级,都可以经一步走至第三级),推广到走上第i级,是走上第i-1级的走法与走上第i-2级的走法之和。很明显,这是一个菲波拉契数列。到这里,读者应能很熟练地写出这个程序。在以后的程序习题中,我们可能还会遇到菲波拉契数列变形以后的结果:如f(i)=f(i-1)+2f(i-2),或f(i)=f(i-1)+f(i-2)+f(i-3)等。 我们再来分析一下尼科梅彻斯定理。定理内容是:任何一个整数的立方都可以写成一串连续的奇数和,如:43=13+15+17+19=64。 从键盘输入一个整数n,要求写出其相应的连续奇数。 我们不妨从简单入手,枚举几个较小的数据: 13=1 23=3+5 33=7+9+11 43=13+15+17+19 53=21+23+25+27+29 根据上面的例子,读者不难看出: (1)输入为n时,输出应有n项。 (2)输入分别为1,2,3…时,则输出恰好为连续奇数,1,3,5,7,9,11…即下一行的首项比上一行的末项大2。 经上面的分析,原本看不出递推关系的问题,呈现出递推关系。在趣的是,这个例子的递推过程,可以有多种算法。 算法一:将所有奇数逐项例举出来,然后将其分段,即: 1; 3 5; 7 9 11; 13 15 17 19; 21… 1 2 3 4 5… 算法二、设输入为n时的输出第一项为a[n],则a[n]=a[n-1]-n+1; 于是我们推出首项后,则输出为a[n]+a[n]+2+…+a[n]+2(n-1) 算法三、进一步总结,不难得出,若输入为n时,首项a[n]=n2-n+1,其余同算法二。下面我们来分析两个与动物有关的趣题。

第3章-程序与递归:组合、抽象与构造

第3章程序与递归:组合、抽象与构造 1、关于计算系统与程序,下列说法正确的是_____。 (A)只有用计算机语言编写出来的代码才是程序,其他都不能称其为程序; (B)构造计算系统是不需要程序的,程序对构造计算系统没有什么帮助; (C)任何系统都需要程序,只是这个程序是由人来执行还是由机器自动执行,可以由机器自动执行程序的系统被称为计算系统; (D)程序是用户表达的随使用者目的不同而千变万化的复杂动作,不是使用者实现的而是需要计算系统事先完成的。 2、关于程序,下列说法不正确的是_____。 (A)“程序”是由人编写的、以告知计算系统实现人所期望的复杂动作; (B)“程序”可以由系统自动解释执行,也可以由人解释由系统执行; (C)普通人是很难理解“程序”的,其也和“程序”无关; (D)“程序”几乎和每个人都有关系,如自动售票系统、自动取款机等。 3、关于程序,下列说法不正确的是_____。 (A)程序的基本特征是复合、抽象与构造; (B)复合就是对简单元素的各种组合,即将一个(些)元素代入到另一个(些)元素中; (C)抽象是对各种元素的组合进行命名,并将该名字用于更复杂的组合构造中; (D)程序就是通过组合、抽象、再组合等构造出来的; (E)上述说法有不正确的。 4、一般而言,设计和实现一个计算系统,需要设计和实现_____。 (A)基本动作和程序; (B)基本动作和控制基本动作的指令; (C)基本动作、控制基本动作的指令和一个程序执行机构; (D)基本动作、控制基本动作的指令和程序。

5、一般而言,一个较高抽象层次的计算系统是可以这样实现的,即_____。 (A)将较低抽象层次的重复性组合,命名为较高抽象层次的指令; (B)利用较高抽象层次的指令进行复合、抽象与构造,即形成高抽象层次的程序; (C)高抽象层次的程序通过其程序执行机构解释为高抽象层次的指令及其操作次序; (D)高抽象层次的指令被替换为低抽象层次的程序,再由低抽象层次的程序执行机构解释并执行。 (E)上述A-D全部。 答案是:E 6、熟悉下列运算组合式(前缀表达式),其中结果为56的是_____。 (A) (* 7 (+ 5 2)); (B) (* (+ 5 3) (+ 5 2)); (C) (+ 20 (+ 6 6)); (D) (- (* 9 8) (- 20 2))。 //本题考查基本运算组合式的构造与计算,尤其是嵌套的运算组合式的计算 答案是:B 7、对于计算式,其正确的运算组合式(前缀表示法)为_____。 (A) (/ (+ 10 / 20 + 8 4) (+ * 3 6 * 8 2 )); (B) ((10 + (20 / (8 + 4))) / ((3 * 6) + (8 * 2))); (C) (/ (+ 10 (/ 20 (+ 8 4))) (+ (* 3 6) (* 8 2))); (D) (/ (/ 20 (+ 10 (+ 8 4))) (* (+ 3 6) (+ 8 2)))。 //本题考查运算组合式的书写与构造 答案是:C 8、请用define运算,定义一个过程实现计算a3,其正确定义的过程为_____。 (A) (define cube a (* a a a)); (B) (define (cube x) (* x x x)); (C) (define (cube a (* a a a))); (D) (define (cube a) (* x x x)))。

递归与递推

2.1 遍历问题 【问题描述】 我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树: 所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。 【输入】 输入数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。 【输出】 输出可能的中序遍历序列的总数,结果不超过长整型数。 【样例】 travel.in abc cba travel.out 4 2.2 产生数 【问题描述】 给出一个整数n(n<1030)和m个变换规则(m≤20)。 约定:一个数字可以变换成另一个数字,规则的右部不能为零,即零不能由另一个数字变换而成。而这里所说的一个数字就是指一个一位数。 现在给出一个整数n和m个规则,要你求出对n的每一位数字经过任意次的变换(0次或多次),能产生出多少个不同的整数。 【输入】 共m+2行,第一行是一个不超过30位的整数n,第2行是一个正整数m,接下来的m 行是m个变换规则,每一规则是两个数字x、y,中间用一个空格间隔,表示X可以变换成Y。 【输出】 仅一行,表示可以产生的不同整数的个数。 【样例】 build.in 1 2 3

2 1 2 2 3 build.out 6 2.3 出栈序列统计 【问题描述】 栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数。 【输入】 就一个数n(1≤n≤1000)。 【输出】 一个数,即可能输出序列的总数目。 【样例】 stack.in 3 stack.out 5 2.4 计数器 【问题描述】 一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9。其中一个页码不含多余的0,如N=1234时第5页不是0005,只是5。 【输入】 一个正整数N(N≤109),表示总的页码。 【输出】 共十行:第k行为数字k-1的个数。 【样例】 count.in 11 count.Out 1 4 1 1 1 1 1 1

递推与递归算法练习题2013.10

递推与递归算法练习题 1.实数数列(realsn) 源程序名realsn.??? (pas,c,cpp) 输入文件名realsn.in 输出文件名realsn.out 时间限制1秒 【问题描述】 一个实数数列共有n项,已知a[i]=(a[i-1]-a[i+1])/2+d,(1

4.5递归算法与递归程序(一、二)

4.5 递归算法与递归程序(一、二) 教者:吴艳超时间: 一、课程内容标准: 递归算法与问题解决: 1、了解使用递归法设计算法的基本过程 2、能够根据具体问题的要求,使用递归设计算法、编写递归函数、编写程序、求解问题 例1 写出两个正整数乘积m×n的递归函数。 例2 汉诺塔问题:传说在古代印度的贝拿勒斯圣庙里,安放一块黄铜板,板上插了三根宝石柱,在其中一根宝石柱,自上而下按由小到大的顺序串有64个金盘。这就是汉诺塔游戏。要求将左边柱子上的64个金盘按照下面的规则移到右边的柱子上。规则:(1)一次只能移动一个盘子(2)盘子只能在三个柱子上存放。(3)任何时候大盘不能放在小盘上面。 二、教学目标 1、知识与技能 (1).认识递归现象。 (2).使用递归算法解决问题往往能使算法的描述乘法而易于表达 (3).理解递归三要素:每次递归调用都要缩小规模;前次递归调用为后次作准备:递归调用必须有条件进行 2、方法与过程: 本节以斐波那契的兔子问题引入,通过发现先后三个月兔子数量的变化规律入手,导出了F(N)=F(N-1)+F(N+2)(N≥3)递推式。马上介绍斐波那契问题的非递归解决方法,如果加以恰当引导,把两个解法对比,会出现效率高的需要较多的经验和技艺才能写出程序,而程序相对容易写出的是在运行时,但效率却不够高。(在调试程序4-16时可逐步加大月数N,会发出N=40时,明显感觉等待的时间较长,而当N=200时,等待的时间会遥遥无期。)汉诺塔问题是一个经典问题,它著名在使用了递归解法来解决问题。理解这个递归解法是重点,也是难点。 3、情感态度和价值观 结合高中生想象具有较强的随意性、更富于现实性的身心发展特点,综合反映出提升学生在各个领域的计算机应用水平,提高学生交流和讨论,自己总结获得新的知识能力,培养学生正确寻找解决问题的方法和正确的学习方法。 三、重点难点 1、教学重点 (1)了解递归现象和递归算法的特点。 (2)能够根据问题设计出恰当的递归程序。 2、教学难点 (1)递归过程思路的建立。 (2)判断问题是否适于递归解法。 (3)正确写出递归程序。 四、教学环境 1、教材处理 教材选自《广东省普通高中信息技术选修一:算法与程序设计》第四章第五节,原教材的编排是以本节以斐波那契的兔子问题引人,导出递归算法,从而自定义了一个以递归方式

用递推关系理论分析递归算法的时间复杂度

用递推关系理论分析递归算法的时间复杂度 [ 摘要 ] 对算法进行时间复杂度分析是算法分析与研究的重要内容,而对递归算法分析其时间复杂度时往往比较困难。 本文提出了用组合数学中的递推关系理论来分析一些特殊的递归算法的时间复杂度, 并同时得出三个推论, 在算法的分析与研究方面具有一定的参考价值。 [ 关键词 ] 时间复杂度,递归,母函数 1. 引言 一个程序在计算机上运行时所耗费的时间取决于对源程序进行编译所需时间、 计算机执行每条指令所需时间、 程序中指令重复执行的次数。 前两条依赖于实现算法的计算机软件、硬件系统,亦即依赖于实现算法所用语言的编译程序的性能和计算机本身的速度。因此习惯上常常用重复执行次数最多的语句频度来分析算法的时间复杂度, 记为t (n ),其中n 为问题的规模或大小。例如对n 个存放于数组a[n] 中的数进行选择法排序的算法: for( i=0; i %c", one, three); }else{ hanoi(n-1, one, three, two); printf("%c —> %c", one, three);

相关文档
最新文档