2007暑假简单题目三

要求以下各题请用递归完成!

 

 

递归算法通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算, 大大地减少了程序的代码量。

一般来说,能够用递归解决的问题应该满足以下三个条件:

1需要解决的问题可以化为一个或多个子问题来求解,而这些子问题的求解方法与原来的问题完全相同,只是在数量规模上不同;

2递归调用的次数必须是有限的;

3必须有结束递归的条件(边界条件)来终止递归.

 

典型例题

1 利用递归调用手段编程计算N!.

分析:根椐数学知识,0!=1,正整数N的阶乘为:N*(N-1)*(N-2)*…*2*1,该阶乘序列可转换为求N*(N-1)!,(N-1)!可以转换为(N-1)*(N-2)!,……,直至转换为0!,0!=1

 

2递归算法X ^n

分析:因为x^n=x*x^(n-1),可以化成求x^(x-1)的问题…………fn(n)=x*f(n-1)

 

3相传在古印度的布拉玛婆罗门圣庙的僧侣在进行一种被称为汉诺塔的游戏,其装置是一块铜板,上面有三根杆(编号A,B,C),A杆上自下而上,由大到小按顺序串上64个金盘.游戏的目标是把 A杆上的金盘全部移到C杆上, 并仍原有顺序叠好.条件是每次只能移动一个盘,并且在每次移动都不允许大盘移到小盘之上.现要求利用递归调用技术给出N个盘从A杆移到C杆的移动过程.

分析:这个移动过程很复杂与烦琐,但规律性却很强.使用递归调用技术来解决这个移动过程,先得找到一个递归调用模型.想要得到汉诺塔问题的简单解法, 着眼点应该是移动A杆最底部的大盘,而不是其顶部的小盘.不考虑64个盘而考虑N个盘的一般情况.要想将A杆上的N个盘移至C,我们可以这样设想:

1.C盘为临时杆,A杆将1N-1号盘移至B.

2.A杆中剩下的第N号盘移至C.

3.A杆为临时杆,B杆将1N-1号盘移至C.

我们看到,步骤2只需移动一次就可以完成;步骤13的操作则完全相同, 唯一区别仅在于各杆的作用有所不同.这样,原问题被转换为与原问题相同性质的, 规模小一些的新问题.: HANOI(N,A,B,C) 可转化为 HANOI(N-1,A,C,B) HANOI(N-1,B,A,B) 其中HANOI中的参数分别表示需移动的盘数,起始盘,临时盘与终止盘,这种转换直至转入的盘数为0为止,因为这时已无盘可移了. 这就是需要找的递归调用模型。

 

如果说例1与例2无法体现递归算法的独特优点,那么,3的解法则很能说明问题, 因为一般的算法是很难解决这个问题的,而过程HONOI只用了4个语句就解决这个难题. 不过要说明的是,按照汉诺塔的移动原则,N个盘从A杆移动到C 杆需要移动盘的次数是 2 N 次幂减 1 , 那么 64 个盘移动次数就是18446744073709511615,19亿亿次.这是一个天文数字,即使一台功能很强的现代计算机来解汉诺塔问题,恐怕也需要很长的时间,因此要想得到结果,在运行程序时, 输入的N可不能太大.据说布拉玛婆罗门圣庙的僧侣声称, 汉诺塔游戏结束就标志着世界末日的到来,现在看来确实是有道理的.因为如果每秒移动一次,64个盘则大约需近5800亿年,而据科学家以能源角度推算,太阳系的寿命只不过150 亿年而已.

 

递归算法的效率往往很低,费时和费内存空间.但是递归也有其长处, 它能使一个蕴含递归关系且结构复杂的程序简洁精炼,增加可读性. 特别是在难于找到从边界到解的全过程的情况下,如果把问题进一步, 其结果仍维持原问题的关系,则采用递归 递归是从函数(过程)自身出发来达到边界条件,在通过边界条件的递归调用过程中,系统用堆栈把每次调用的中间结果(局部变量和返回地址) 保存起来,直至求出递归边界值f(0)=a.然后返回调用函数.返回的过 程中,中间结果相继出栈恢复,f(1)=g(1,a) f(2)=g(2,f(1)) …… 直至求出f(n)=g(n,f(n-1)).

 

 

 

典型例题类型:

数据的定义形式按递归定义. 如裴波那契数列的定义:
递归的适用范围

数据之间的关系(即数据结构)按递归定义.如树的遍历,图的搜索等.

问题解法按递归算法实现.例如回溯法(回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”)。

 

 

 

 

练习题:

1.完成汉诺塔游戏(盘子数n由键盘输入)。

 

2. 在N行N列的数阵中数K(1〈=K〈=N)在每行和每列中出现且仅出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。  编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。

        1  2  3  4  5

        2  3  4  5  1

        3  4  5  1  2

        4  5  1  2  3

        5  1  2  3  4

 

3巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。

 

4.已知6个城市,用c[i,j]表示从i城市到城市j是否有单向的直达汽车 (1=<<=6,1<=j<=6), c[i,j]=1 表示城市i到城市j有单向直达汽车; 否则 [i,j]0.  试编制程序,对于给出的城市代号i,打印出从该城市出发乘车(包括转车)可以到达的所有城市(规定:认为自己没有直达自己的汽车)。

 

 

 

C1

C6

C5

C4

C3

C2

 

该题可采用读入如下0-1矩阵:

 

 

 

5 请设计一个程序,由计算机把1...8的八个自然数填入图中,使得横、竖、对角任何两个相邻的小方格中的两个数是不连续的。(下图右侧的 4 个图为禁止的情形).

                ┌─ ┐             ┌ ─┐                         ┌─┐
                │     │             │ 4  │                         │8  │
        ┌─┼ ─┼─┐     └─ ┼─┐         ┌─┼─┘
        │    │     │    │              │5  │         │7  │
        ├─┼ ─┼─┤              └─┘         └─┘
        │    │     │    │      ┌─┐
        └─┼ ─┼─┘      │6  │          ┌─┬─┐
                │     │              ├─┤          │1  │2  │
                └ ─┘              │7  │          └─┴─┘
                                           └─┘

6.在一个4*4的小方格(如图所示)中放置8个*号,使得每行每列放且仅放两个*号。

          ┌─┬─┬─┬─┐
          │*  │*  │    │    │
          ├─┼─┼─┼─┤
          │*  │    │*  │    │
          ├─┼─┼─┼─┤
          │    │*  │    │*  │
          ├─┼─┼─┼─┤
          │    │    │*  │*  │
          └─┴─┴─┴─┘
 
求出所有的基本解。

 

7.任何大于1的自然数n,都可以写成若干个大于等于 2 ,且小于等于n的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如9 的质数和表达式就有四种本质不同的形式: 9 = 2+5+2 = 2+3+2+2 = 3+3+3 = 2+7 . 这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式. 试编程求解自然数 n 可以写成多少种本质不同的质数和表达式.

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值