递归习题

合集下载

C++练习题(含答案)

C++练习题(含答案)

C++练习题一、掌握递归调用:任何有意义的递归调用总是由两部分组成的,即递归公式与递归结束条件。

递归函数设计的一般形式是:函数类型递归函数名f (参数x ){if(满足结束条件)结果=初值;else结果=含f(x-1)的表达式;返回结果;}例题:书P81例4-12,例4-13,二、掌握冒泡排序法算法:如果一个数组b,有n个数,则要进行n-1趟比较,在第一趟中要进行n-1次两两比较,在第j趟中要进行n-j次两两比较,冒泡排序的算法如下边:void bubble ( int b[ ], int n){for ( int i=0; i<n-1;n++ );for ( int j=0;j<n-1-i ; j++);if ( b[j]<b[i] ){int t=b[j];b[j]=b[j+1];b[j+1]=t;}}例题:书P143例7-3三、掌握二维数组的应用例题:书P146例7-4,例7-6四、练习1.C++中两个逻辑常量是什么?(true,false)C++语言和C语言的不同点(C++为面向对象程序设计,C为面向过程程序设计或称结构化程序设计)。

2.C++语言的具有抽象、封装、继承、多态的特点,理解每个特点的意思(课本P3-P4)3.表达式中不同类型的数据进行混合运算时,不同类型数据的转换顺序。

比如10+a+x*y,其中a为float型,x为int型,y为double型,那么整个表达式的值是什么类型?(double型)4.复合的赋值运算符(a+=b、x*=y+8、%=)的用法a+=b 相当于a=a+bx*=y+8 相当于x=x*(y+8)a%=b 相当于a=a%b5.在类中声明一个友元函数的格式?比如viod fun()函数是类A的友元函数。

友元函数的限定词:friend例: friend viod fun()6.熟悉三目运算符(?:)(课本P47)、自增(++)自减(--)的用法格式:关系表达式?表达式1:表达式2功能:当关系表达式的值为真,结果为表达式1的值,关系表达式的值为假,结果为表达式2的值例:若有定义”int x=4,y=5;”,则表达式”y>x++?x--:y++”的值为( C )A) 3 B) 4 C) 5D) 6《习题与指导》P5 第27-32题,自增自减: 《习题与指导》P4第17题7.三个循环语言(for、while、do…while)的用法,给定条件后,会判断循环次数。

数据结构练习题第三章栈、队列和数组习题及答案

数据结构练习题第三章栈、队列和数组习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。

在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。

2.栈的基本运算至少应包括________、________、________、________、________五种。

3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。

4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。

5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。

6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。

7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。

int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。

Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。

数据结构之递归

数据结构之递归

数据结构之递归Ⅲ递归的三⼤要素// 算 n 的阶乘(假设n不为0)int f(int n){if(n <= 2){return n;}}第三要素:找出函数的等价关系式第三要素就是,我们要不断缩⼩参数的范围,缩⼩之后,我们可以通过⼀些辅助的变量或者操作,使原函数的结果不变。

例如,f(n) 这个范围⽐较⼤,我们可以让 f(n) = n * f(n-1)。

这样,范围就由 n 变成了 n-1 了,范围变⼩了,并且为了原函数f(n) 不变,我们需要让 f(n-1) 乘以 n。

说⽩了,就是要找到原函数的⼀个等价关系式,f(n) 的等价关系式为 n * f(n-1),即f(n) = n * f(n-1)。

这个等价关系式的寻找,可以说是最难的⼀步了,如果你不⼤懂也没关系,因为你不是天才,你还需要多接触⼏道题,我会在接下来的⽂章中,找 10 道递归题,让你慢慢熟悉起来。

找出了这个等价,继续完善我们的代码,我们把这个等价式写进函数⾥。

如下:// 算 n 的阶乘(假设n不为0)int f(int n){if(n <= 2){return n;}// 把 f(n) 的等价操作写进去return f(n-1) * n;}⾄此,递归三要素已经都写进代码⾥了,所以这个 f(n) 功能的内部代码我们已经写好了。

这就是递归最重要的三要素,每次做递归的时候,你就强迫⾃⼰试着去寻找这三个要素。

还是不懂?没关系,我再按照这个模式讲⼀些题。

有些有点⼩基础的可能觉得我写的太简单了,没耐⼼看?少侠,请继续看,我下⾯还会讲如何优化递归。

当然,⼤佬请随意,可以直接拉动最下⾯留⾔给我⼀些建议,万分感谢!Ⅲ案例1:斐波那契数列斐波那契数列的是这样⼀个数列:1、1、2、3、5、8、13、21、34....,即第⼀项 f(1) = 1,第⼆项 f(2) = 1.....,第 n 项⽬为 f(n) = f(n-1) + f(n-2)。

求第 n 项的值是多少。

《数据结构》第六章 递归 习题

《数据结构》第六章  递归  习题

《数据结构》第六章递归习题基本概念题:6-1 什么叫递归?6-2 适宜于用递归算法求解的问题的充分必要条件是什么?什么叫递归出口?6-3 阶乘问题的循环结构算法和递归结构算法哪个的时间效率好,为什么?6-4 非递归函数调用时系统要保存哪些信息?递归函数调用时系统要保存哪些信息?系统怎样保存递归函数调用时的信息?6-5 什么叫运行时栈?什么叫运行时栈中的活动记录?6-6 叙述递归算法的执行过程。

复杂概念题:6-7 推导求解n阶汉诺塔问题要执行的移动操作(即算法中printf()函数的调用)次数。

6-8 我们讨论过的折半查找函数设计如下:int BSearch(elemtype a[], elemtype x, int low, int high){int mid;if(low>high) return -1;mid =(low+high)/2;if(x == a[mid]) return mid;if(x < a[mid]) return (BSearch(a,x,low,mid-1));else return (BSearch(a,x,mid+1,high));}讨论如果把上述折半查找函数中最后两语句改为如下形式能否实现算法的设计要求,为什么?if(x < a[mid]) BSearch(a,x,low,mid-1);else BSearch(a,x,mid+1,high);算法设计题:6-9 要求:(1)写出求1,2,3,......,n的n个数累加的递推定义式;(2)编写求1,2,3,......,n的n个数累加的递归算法,假设n个数存放在数组a中。

6-10 要求:(1)写出求1,2,3,......,n的n个数连乘的递推定义式;(2)编写求1,2,3,......,n的n个数连乘的递归算法,假设n个数存放在数组a中。

6-11 设a是有n个整数类型数据元素的数组,试编写求a中最大值的递归算法。

递归数列练习题

递归数列练习题

递归数列递归数列1. a 1 = 10 , n n aa 21=+ , 求a n . 2. a 1 = 1 , a n + 1 = 3 a n + 2 n , 求a n . 3. a 1 =-1 , 313n n a a =+ , 求a n . 4. a 1 = 0 , a n + 1 = 2 a n n + n -1 , 求a n . 5. a 1 = 1 , a n + 1 = 3 a n + ( 2 n -1 )·2 n , 求a n . 6. a 1 = 1 , a n + 1 = 2 a n + 3·5 n , 求a n . 7. a 1 = 2 , a 2 = 3 , a n + 2 = 3 a n + 1-2 a n , 求a n . 8. a 1 = 1 , 12336241++-++=n nn n n a a , 求a n . 9. a 1 = 1 , 4 a n + 1-a n a n + 1 + 2 a n = 9 , 求a n . 10. a 0 = a 1 = 1 , 12122----=-n n n n n a a a a a , 求a n . 11. a 1 = a 2 = 1 , 2212--+=n n aan a ( n ≥3 ) , 求证:求证:a n 为整数为整数. 12. a 1 = 4 , 4231+++=n n a a n a , 求a n . 13. a 1 = a 2 = 1 , a 3 = 2 , 2131--++=n n n a a a n a ( n ≥3 ) , 求a n . 14. a 1 = 2 , 6421+-+=n n a a n a , 求a n . 15. a 1 = 1 , a 2 = 2 , 2231--=n n a a n a ( n ≥3 ) , 求a n . 16.a 1 = a 2 = 1 , a n+2 = 6 a n+1-8 a n + 2 n , 求a n . 17. a 1 = 1 , a 2 = 10 , 3122++=n nn a a a , 求a n . 2na 2314++=n a a 113453--×+=n n na a , ()112+-=na n a ()nna n n n n a n n -++++=1422 = 45 na a21+= ()n a 241161++=n a ×=4135.用1,2这两个数字构造n 位数,但不允许两个1相邻,能构造多少个这样的n 位数?位数?36.用1,2,3这三个数字构造n 位数,但不允许两个1相邻,能构造多少个这样的n 位数?位数?37. 把一个圆分成n 个扇形,依次记为S 1 ,S 2 ,…,S n ,每个扇形都可用红,白,兰三色之一种涂色,要求相邻的扇形颜色互不相同,有多少种涂色方法? 38.S = { 1 , 2 , … , n } , A 为至少含有两项的,公差为正的等差数列,其项都在S 中,且添加S 的其他元素于A 后均不能构成与A 有相同公差的等差数列,求这种A 的个数的个数 ( 这里只有两项的数也看作是等差数列是等差数列 ) . 39. 用 a n 表示由0和1组成的长度为组成的长度为n 的排列中没有两个1相连的排列个数排列个数 ( 如00101,10100长度都为5 ),试证明:a 4 k + 2 能被3 整除,k ≥0 . 40. 一容器可盛水10千克,第一次将其倒掉千克,第一次将其倒掉 31,然后注入1千克纯酒精;第二次再倒掉第二次再倒掉 31,然后注入21千克纯酒精;以后每次倒掉以后每次倒掉 31,然后使注入纯酒精的量为上次注入量的半然后使注入纯酒精的量为上次注入量的半 . 第 n 次操作后,容器内酒精溶液的浓度是多少酒精溶液的浓度是多少 数学归纳法数学归纳法41.a 1 = 1 , a n + 1 = 3 n ( n + 1 ) + 1 , 求证:S n = n 3 . 42.求证:对于n ∈N , 4 n + 15 n -1 可被可被 9 整除整除 . 43.求证:当n ≥5时,2 n >n 2 . 44.求证:对于n ∈N , a n + 1 + ( a + 1 ) 2 n-1 可被可被 a 2 + a + 1 整除整除 . 45.求证:当n >1时,()()()2121215131111+->+++n n L . 46.求证:()()21213221+<+×++×+×n n n L . 47.求和:()()å=-+=ni i i inS11212822. 48.n n S 131211++++=L , 求证:221n nS +> ( n≥2 , n ∈N ) 49.求证:3 · 5 5 2 n + 1 + 2 3 n + 1 是17的倍数的倍数 . 50.()x xx f+=121,f n ( x ) = f 1 [ f n n -1 ( x ) ] , 求f n ( x ) 的表达式的表达式 . 51.a , b ∈R + , , 且111=+b a ,求证:(a+b)n -a n -b n ≥22n -2n + 1 . (n ∈N ) 52.x >-1, n ∈N, 求证:( 1 + x ) n ≥1 + n x . 53. n ∈N, 求证:方程x 2 + y 2 = z n 总有正整数解. 54. 任给n+1个不超过2n 的正整数,则必有一个是另一个的倍数的正整数,则必有一个是另一个的倍数 . 55. 求证: 可将一个正三角形分割成n 个等腰三角形个等腰三角形 . ( n∈N ) 56. n ∈N , n ≥3 , 求证: 2 n = 7 · x 2 + y 2 有奇数解有奇数解 . 57. 斐波那契数列斐波那契数列 { f n  n } : f 0 = 0 , f 1 = 1 , f n+2 = f n+1 + f n , 求证:12221++=+n nn fff. 58. 圆周上2003个点,每点都标上+1或-1; 如果自某点起,依任一方向绕圆周前进到任何一点时,所经过的数字之和都是正数,则称之为好点. 求证:若标有-1的点数少于667,则至少存在一个好点,则至少存在一个好点 . 。

递归练习题

递归练习题

递归练习题1.设计一个函数:double power(double x,int n);返回x的n次方值。

2.设计一个函数: bool check(int n,int d);如果数字d在整数n的某位中出现,则返回真值,否则返回假值。

例如:check(35628,6)=true ,check(35928,7)=false。

3.设计一个函数:int digit(int n,int k);它返回整数n从右边开始数第k个数字的值。

例如:digit(35628,4)=5, digit(628,5)=0。

4.设计一个函数:int sumofn(int n);它返回整数n的各位数字之和。

例如:sumofn(35628)=24, sumofn(628)=16。

5.设计一个函数int reverse(int n);将整数n反向。

例:reverse(1276)=6721。

6.设计一个高效函数:bool prime(int n);当n为素数时,它返回真值,否则返回假值。

7.设计一个函数:bool ninm(int n,int m);如果构成整数n的数字都在整数m中出现,则返回真值,否则返回假值。

例如:ninm(35323,523)=true ,ninm(187,18)=false。

8.设计一个函数:bool rev(s:string);字符串s是回文时返回真值,否则返回假。

9.设计一个函数:bool revn(int n);整数n是回文时返回真值,否则返回假。

10.用选择排序技术设计一个过程:void sortp(int a[],int n);对数组a 的n个元素进行排序。

11.函数f(m,n)定义为:f(m,n)=f(m-1,f(m,n-1)) 当m*n<>0 时;f(m,n)=m+n+1 当m*n=0 时。

设计递归函数求解f(m,n).12.ackerman函数ack(m,n)定义为:ack(m,n)=ack(m-1,ack(m,n-1)) 当 m,n>=1 时;ack(m,0)=ack(m-1,1), 当m>=1 时;ack(0,n)=n+1, 当n>=0 时。

递归练习题(打印版)

递归练习题(打印版)

递归练习题(打印版)### 递归练习题(打印版)#### 一、递归基础概念题1. 定义题:请简述什么是递归,并给出递归的基本形式。

2. 判断题:以下哪些函数是递归的?- A. `f(x) = x + 1`- B. `g(n) = n * g(n-1)` (n > 0)- C. `h(x) = x * h(x-1)` (x > 1)3. 简答题:递归和迭代有什么区别?#### 二、递归函数编写题1. 编写递归函数:编写一个递归函数,实现阶乘计算。

2. 编写递归函数:编写一个递归函数,实现斐波那契数列的第n项。

3. 编写递归函数:编写一个递归函数,实现汉诺塔问题的解决方案。

#### 三、递归算法应用题1. 应用题:如何使用递归算法解决归并排序问题?2. 应用题:使用递归算法解决二叉树的深度优先搜索(DFS)。

3. 应用题:描述如何使用递归算法实现图的深度优先搜索(DFS)。

#### 四、递归优化题1. 优化题:对于递归算法,如何避免重复计算?2. 优化题:请解释尾递归优化的概念,并给出一个尾递归的例子。

3. 优化题:如何使用记忆化递归(Memoization)来优化递归算法?#### 五、递归问题解决题1. 问题解决题:给定一个数字n,请使用递归算法找出n的二进制表示中1的个数。

2. 问题解决题:使用递归算法实现一个函数,判断一个字符串是否是回文。

3. 问题解决题:给定一个整数数组,使用递归算法找出数组中的最大值。

#### 六、递归思维拓展题1. 思维拓展题:递归算法在解决哪些类型的问题时特别有效?2. 思维拓展题:在编程中,递归算法有哪些潜在的缺点?3. 思维拓展题:请讨论递归算法在人工智能领域的应用。

#### 七、递归实践题1. 实践题:实现一个递归函数,用于计算组合数C(n, k)。

2. 实践题:编写一个递归函数,实现快速排序算法。

3. 实践题:给定一个字符串,使用递归算法实现字符串的反转。

递归练习题

递归练习题

递归程序设计
1.计算最大约数gcd(m,n)可用递归形式定义如下:
若m%n 等于0,则gcd(m,n)等于n
否则,gcd(m,n)等于gcd(n,m%n)。

编写一递归函数,求最大约数,并测试。

2.编写一递归函数,计算下面的级数:
i
i m 1......31211)(++++= 3.编写一递归函数,计算下面的级数:
1
2.....11594735231)(+++++++=i i i m 4.编写一函数,逆序输出一个整数n 。

函数头如下:
void reverseDisplay(int value)
5.编写一函数,逆序输出一个字符串,函数头如下:
void reverseDisplay(const char *s)
6.编写一递归函数,统计一个指定字符在一个字符串中出现的次数,函数头如下: int count(char *,char )
7.编写一递归函数,计算一个整数中所有数字之和。

函数头如下: int sumDigit(long n)
8. 编写一递归函数,计算x n
9. 编写一递归函数,计算1+2+3+4+…+n 。

n 为正整数
10. 编写一递归函数,计算n!
11.编写一递归函数 void Inverse(char ch[])将字符串ch 逆序输出。

12.编写一递归函数 void Inver_Out(int a[],int n)将数组a中的数据逆序输出。

13. 编写一递归函数void DtoP(int n,int p),实现将十进制数n 转换为p进制数并输出。

14.使用递归调用方法将一个n位整数转换成字符串。

练习题6

练习题6
qu[rear].parent=-1;//根结点没有双亲,其parent置为-1
while (front!=rear)//队不空循环
{front++;
p=qu[front].s;//出队一个结点*p,它在qu中的下标为front
if (p->data==x)//找到值为x的结点
{printf("从根结点到%c结点的路径: ",p->data);
解:先序遍历树中结点的递归算法如下:
void PreOrder1(ElemType A[],int i,int n)
{if (i<n)
if (A[i]!='#')//不为空结点时
{printf("%c ",A[i]);//访问根结点
PreOrder1(A,2*i,n);//遍历左子树
PreOrder1(A,2*i+1,n);//遍历右子树
return h;
else
{l=Level(bt->lchild,x,h+1);//在左子树中查找
if (l!=0)
return l;
else//在左子树中未找到,再在右子树中查找
return(Level(bt->rchild,x,h+1));
}
}
上机实验题
假设一棵二叉树采用二叉链存储结构,其中所有结点值均不相同。设计一个算法求从根结点到值为x的结点的路径。并用相关数据进行测试。
图8.3一棵二叉树
(6)如果一棵哈夫曼树T有n0个叶子结点,那么,树T有多少个结点?要求给出求解过程。
答:一棵哈夫曼树中只有度为2和0的结点,没有度为1的结点,由非空二叉树的性质1可知,n0=n2+1,即n2=n0-1,则总结点数n=n0+n2=2n0-1。

具体数学(第2版)习题解析

具体数学(第2版)习题解析
多少?
- 10 -
扩展思考 2:三色河内塔问题。如果 3n 个圆盘有 n 种尺寸,每种尺寸的圆盘又有 3 种颜色, 要想做到如下图所示的移动结果,足够且最少的移动次数是多少?
【1.13】有 n 条 Z 形线所定义的区域的最大个数是多少?每条 Z 形线由两条平行的无限半直线 和一条直线段组成。
提示:如上图所示,两条 Z 形线可分割出 12 个区域。 解: 思路 1:令 为 n 个 Z 形线所围成的区域的最多数。
1.2.2 作业题
【Z1.1】楼梯有 级台阶,上楼时可以一步上一级台阶,也可以一步上两级台阶,请问有多少 种不同的走法?
答: (1)解法一:待定系数法构造等比数列(初等代数解法) 令 为 级台阶的走法,则有:
设常数 和 ,使得如下等式成立:
即: 可知:
可求得:
当 时,有如下方程组:
-3-
可得:
由于
- 11 -
由于第 n 个 Z 形线与前 n-1 个 Z 形线中的每个 Z 形线最多可有 9 个交点,共计最多可有 9(n-1) 个交点,可新增 9(n-1)+1=9n-8 个区域。因此,可得:
进一步计算,可得:
思路 2:先研究 n 个等号“=”和 n 个不等号“≠”的情况;然后再研究 n 个 Z 形线的求解思 路。注:这种方法虽然麻烦些,但有利于深入分析问题,有利于训练思维。
是 n 个圆盘按顺时针方向,从 B 柱经过 C 柱再到 A 柱的最少移动次数。进而可知,从 C 经
A 到 B,或从 A 经 B 到 C 的最少移动次数也一定都是 次。 (2)研究小的情形。可考虑 3 个圆盘按照题中规则进行移动的步骤和过程,以进一步理解题
意。
(3)证明 =?
当 n=0 时, =0 是显然的。

递归习题——精选推荐

递归习题——精选推荐

1、斐波那契数列【问题描述】斐波纳契数列0,1,1,2,3,5,8,13,21,34,55…从第三项起,每一项都是紧挨着的前两项的和。

写出计算斐波那数列任意一个数据项的递归程序。

【输入格式】所求项数【输出格式】数据项的值【输入样例】10【输出样例】342、倒序数【问题描述】用递归算法写程序,输入一个非负整数,输出这个数的倒序数。

【输入格式】一个非负整数【输出格式】倒序结果【输入样例】123【输出样例】3213、十进制转换成八进制数【问题描述】用递归算法,把任一给定的十进制数转换成八进制数输出。

【输入格式】一个正整数,表示需要转换的十进制数。

【输出格式】一个正整数,表示转换之后的八进制数。

【输入样例】15【输出样例】174、求n!的值【问题描述】用递归算法,求n!的精确值(n以一般整数输入)。

【输入样例】10【输出样例】10!=36288005、求最大公约数【问题描述】用递归方法求两个正整数m和n的最大公约数。

(m>0,n>0)【输入格式】两个数,即m和n的值。

【输出格式】最大公约数。

【输入样例】8 6【输出样例】gcd=26、背包问题【问题描述】简单的背包问题,设有一个背包,可以放入的重量为s。

现有n件物品,质量分布为w1,为,…,wn(1≤i≤n),均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s。

找到一组解即可。

【输入格式】第一行是物品总件数和背包的载重量,第二行为各物品的重量。

【输出格式】各所选物品的序号和重量。

【输入样例】5 101 2 3 4 5【输出样例】number:1 weight:1number:4 weight:4number:5 weight:57、2的幂次方任何一个正整数都可以用2 的幂次方表示:如137=2^7+2^3+2^0同时约定用括号来表示次方即a^b可表示为a(b)所以137可表示为2(7)+2(3)+2(0)进一步:7=2^2+2+2^0 (2^1用2 表示)3=2+2^0所以137可表示为:2(2(2)+2+2(0))+2(2+2(2(0))+2(0)又如:1315=2^10+2^8+2^5+2+1所以1315最后可表示为:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)【输入格式】正整数(n<=20000)【输出格式】符合约定的n的0,2表示(在表示中不能有空格)【输入样例】137【输出样例】2(2(2)+2+2(0))+2(2+2(0))+2(0)8、加法表【问题描述】著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。

递归基础练习题

递归基础练习题

递归基础练习题1.求1+2+3+……+n的值2.求1*2*3*……*n的值3.数的全排列问题。

将n个数字1,2,…n的所有排列按字典顺序枚举出来2312133123214.数的组合问题。

从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。

如n=3,m=2时,输出:1213239.求两个数的最大公约数。

10.求两个数的最小公倍数。

5.小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子8.着名的菲波拉契(Fibonacci)数列,其第一项为1,第二项为1,从第三项开始,其每一项都是前两项的和。

编程求出该数列前N项数据。

15.梯有N阶,上楼可以一步上一阶,也可以一次上二阶。

编一个程序,计算共有多少种不同的走法。

6.有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。

问过n个月后共有多少对兔子7.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。

这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子经过每个村子卖出多少只鸭子11.输入一个数,求这个数的各位数字之和。

12.角谷定理。

输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。

经过如此有限次运算后,总可以得到自然数值1。

求经过多少次可得到自然数1。

如:输入22,输出168421STEP=1613.将十进制转换为二进制。

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份互不相同的正整数之和的方法总数。

算法与程序实践习题解答8(递归)

算法与程序实践习题解答8(递归)
问题描述:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法(用K表示)?注意:5,1,1和1,5,1 是同一种分法。
输入:
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出:
对输入的每组数据M和N,用一行输出相应的K。
CS
(来源:2816,程序设计导引及在线实践(李文新)例9.6P204)
问题描述:
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入:
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
《算法与程序实践》习题解答8——递归
让我们来看看计算n的阶乘的计算机程序的写法,很直接地我们会用一个循环语句将n以下的数都乘起来:
int n,m = 1;
for(int i = 2; i <= n; i++) m *= i;
printf(“%d的阶乘是%d\n”, n, m);
因为n的阶乘定义为n乘以n-1的阶乘,所以还可以用下面的方法来求n的阶乘:
输入:
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出:
输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。
样例输入:
* + 11.0 12.0 + 24.0 35.0

数据结构课后答案

数据结构课后答案

6.4 补考练习题及参考答案6.4.1 单项选择题1. 递归函数()(1)(1)f n f n n n =-+>的递归出口是_______。

A. (1)f =1B. (1)f =0C. (0)f =0D. ()f n n =答:当n=0时,(1)0f =。

本题答案为B 。

2. 递归函数()(1)(1)f n f n n n =-+>的递归体是________。

A. (1)1f =B. (0)0f =C. ()(1)f n f n n =-+D. ()f n n =答:递归体反映递归过程。

本题答案为C 。

3. 121()...1223(1)f n n n =+++⨯⨯⨯+,递归模型为_____。

A. 121()...1223(1)f n n n =+++⨯⨯⨯- B. 121()...(1)1223(1)f n f n n n=++++-⨯⨯-⨯ C. 1(1)2f = 1()(1)(1)f n f n n n =-+⨯- D. 1()(1)(1)f n f n n n =-+⨯- 答:递归模型由两部分组成,一是递归出口,另一是递归体,上述选项中只有C 符合条件。

本答案为C 。

4.将递归算法转换成对应的非递归算法时,通常需要使用________保存中间结果。

A.队列B.栈C.链表D.树答:递归计算过程是:先进行递归分解,知道递归出口为止,然后根据递归出口的结果反过来求值。

这样通常需要后面的递推式先计算出结果,这正好满足栈的特点。

所以本题答案为B 。

6.4.2填空题1.将转化成递归函数,其递归出口是___①____,递归体是___②___答:①(1)0f = ②()(1)f n f n =-+2.有如下递归过程:void print(int w){int i;if (w!=1){ print(w-1);for(i=1;i<=w;i++)printf(“%3d”,w);printf(“\n”);}}调用语句print(4)的结果是________。

C++第5章函数 习题答案

C++第5章函数 习题答案

第5章函数与预处理1.利用递归函数调用方式,将所输入的5个字符以相反顺序打印出来。

#include <iostream>using namespace std;int main(){ int i=5;void palin(int n);cout<<"请输入5个字符:";palin(i);cout<<endl;return 0;}void palin(int n){ char next;if(n<=1){ next=getchar();cout<<next;}else{ next=getchar();palin(n-1);cout<<next;}}2.编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),其中Euclid算法:(1)如果a除以b能整除,则最大公约数是b。

(2)否则,最大公约数等于b和a%b的最大公约数。

#include <iostream>using namespace std;int GCD(int a,int b){ if(a%b==0)return b;elsereturn GCD(b,a%b);}int main(){ i nt i,x,y;cout<<"请输入两个正整数,用空格隔开两个数:";cin>>x>>y;i=GCD(x,y);cout<<x<<"与"<<y<<"的最大公约数为:"<<i<<endl;return 0;}3.编写递归函数求Fibonacci数列的第n项,这个数列是这样定义的:fib(n)=fib(n-1)+fib(n-2)#include <iostream>using namespace std;int fib(int n){ if(n==0)return 1;else if (n==1)return 1;else{ int i;i=fib(n-1)+fib(n-2);return i;}}int main(void){ int i,z;cout<<"请输入要计算的第几项:";cin>>z;i=fib(z);cout<<"fibonacci数列的第"<<z<<"项为:"<<i<<endl;return 0;}4.编写函数,计算s=22!+32!。

程序与递归组合抽象与构造练习题答案解析

程序与递归组合抽象与构造练习题答案解析

第3章程序和递归: 组合、抽象和结构1.相关计算系统和程序, 下列说法正确是_____。

(A)只有用计算机语言编写出来代码才是程序, 其它全部不能称其为程序;(B)结构计算系统是不需要程序, 程序对结构计算系统没有什么帮助;(C)任何系统全部需要程序, 只是这个程序是由人来实施还是由机器自动实施, 能够由机器自动实施程序系统被称为计算系统;(D)程序是用户表示随使用者目标不一样而千变万化复杂动作, 不是使用者实现而是需要计算系统事先完成。

答案:C解释:本题考查程序, 计算系统等概念;(A)程序= 基础动作指令一个组合或实施序列, 用以实现复杂动作, 只用计算机语言编写出来代码称为程序, 这个概念太狭隘了, A错误;(B)计算系统一部分是由程序组成, 所以B 错误;(C)计算系统= 基础动作+ 指令+ 程序实施机构, 任何系统全部需要系统, C完全正确;(D)程序= 基础动作指令一个组合或实施序列, 用以实现复杂动作, 并不是由用户表示, 随使用者不一样而千变万化复杂动作。

所以D是错;具体内容参考第三章视频之“程序作用和本质”及第三章课件。

2.相关程序, 下列说法不正确是_____。

(A)“程序”是由人编写、以通知计算系统实现人所期望复杂动作;(B)“程序”能够由系统自动解释实施, 也能够由人解释由系统实施;(C)一般人是极难了解“程序”, 其也和“程序”无关;(D)“程序”几乎和每个人全部相关系, 如自动售票系统、自动取款机等。

答案:C解释:本题考查程序概念;程序= 基础动作指令一个组合或实施序列, 用以实现复杂动作, 所以A,B, D全部是正确;C说一般人极难了解程序, 这显然是错误。

所以选C;具体内容参考第三章视频之“程序作用和本质”及第三章课件。

3.相关程序, 下列说法不正确是_____。

(A)程序基础特征是复合、抽象和结构;(B)复合就是对简单元素多种组合, 立即一个(些)元素代入到另一个(些)元素中;(C)抽象是对多种元素组合进行命名, 并将该名字用于更复杂组合结构中;(D)程序就是经过组合、抽象、再组合等结构出来;(E)上述说法有不正确。

有关二阶线性递归(推)数列的理论及应用

有关二阶线性递归(推)数列的理论及应用

有关二阶线性递归(推)数列的理论及应用摘要】本文旨在对现行中学教材中的一般递推数列进行研究,用二阶线性递推的理论探讨其求数列通项及数列和的一般方法。

【关键词】二阶线性递推数列;齐次式;特征方程;特征根Of the second-order linear recursion (push) the theory of series and its applicationZong Yumei【Abstract】The purpose of this paper to the existing secondary school textbook series of the general recursive study, using the theory of second-order linear recursive order to investigate the series, and several passed out and the general approach.【Key words】second-order linear recursive sequence; homogeneous type; characteristic equation; eigenvalue1关于递推数列的通项问题对于数列a1,a2,a3......,an (1)如果存在两个固定的数(实数或复数)p1p2使对任意n都有an=2+p1an+1+p2an=0(2)则称数列(1)为二阶线性递推数列。

我们知道,如果要求出数列(1),只需知道前两项即a1,a2再根据(2)式可求出a3,同理可求出a4,a5……从而可以找到an的表达。

满足以下两个条件:(1)当n=1,2,3,……k,得a1,a2,a3,……ak;(2)对任意n,由该表达式可以得到数列(1)的项,则这个表达式就解决了符合(2)式的数列(1)的问题。

除此之外,如果存在n和2个常数c1和c2的函数:an=f(n,c1,c2)而两个常数满足方程:f(1,c1,c2)=a1f(2,c1,c2)=a2那末,也就找到了an的一般表达式。

数学归纳和递归问题

数学归纳和递归问题

数学归纳和递归问题知识点:数学归纳法知识点:递归问题知识点:递归的定义与特性知识点:递归的类型与例子知识点:数学归纳法的步骤与条件知识点:数学归纳法的应用与例子知识点:递归与数学归纳法的联系与区别知识点:递归的转换与化简知识点:数学归纳法在不同领域的应用知识点:递归问题解决策略知识点:递归问题的训练与提高习题及方法:习题1:证明对于任何自然数n,以下等式成立:n(n+1)(2n+1) = (2n^2 + 2n + 1) - (n^2 - n + 1)答案与解题思路:首先展开等式的右边,得到:2n^3 + 2n^2 + n - n^2 + n - 1= 2n^3 + n^2 + 2n - 1然后将等式的左边展开,得到:n^3 + n^2 + n^2 + 2n + n= n^3 + 2n^2 + 3n比较等式的两边,可以看出它们相等,因此证明了该等式对于任何自然数n成立。

习题2:编写一个递归函数,计算自然数的阶乘。

答案与解题思路:一个递归函数计算自然数的阶乘可以写为:def factorial(n):if n == 0:return 1return n * factorial(n-1)该函数通过递归调用自身来计算阶乘。

当n等于0时,返回1,因为0的阶乘定义为1。

否则,返回n乘以n-1的阶乘。

习题3:证明对于任何自然数n,以下等式成立:1^3 + 2^3 + 3^3 + … + n^3 = (1 + 2 + 3 + … + n)^2答案与解题思路:首先使用数学归纳法证明该等式。

基础步骤:当n=1时,等式成立,因为1^3 = (1)^2。

归纳步骤:假设当n=k时等式成立,即1^3 + 2^3 + 3^3 + … + k^3 = (1 + 2 + 3 + … + k)^2。

接下来需要证明当n=k+1时等式也成立。

根据归纳假设,有:1^3 + 2^3 + 3^3 + … + k^3 = (1 + 2 + 3 + … + k)^2将k+1的立方加到等式的两边,得到:1^3 + 2^3 + 3^3 + … + k^3 + (k+1)^3 = (1 + 2 + 3 + … + k)^2 + (k+1)^3根据求和公式,有1 + 2 + 3 + … + k = k(k+1)/2,因此可以将等式简化为:(k(k+1)/2)^2 + (k+1)^3 = (k+1)2(k+2)/2)2展开等式的两边,得到:k2(k+1)2/4 + (k+1)^3 = (k^2 + 2k + 1)(k+2)^2/4化简等式,得到:k2(k+1)2/4 + (k+1)^3 = (k+1)(k+2)^2/4因此证明了当n=k+1时等式也成立。

c++练习题(带答案)

c++练习题(带答案)

一、选择题1.C++语言属于( C )。

A〕自然语言 B〕机器语言 C〕面向对象语言 D〕汇编语言2.下面选项中不属于面向对象程序设计特征的是(C) 。

A〕继承性 B〕多态性 C〕相似性 D〕封装性3.可用作C++语言用户标识符的一组标识符是( B )。

A〕 void define +WORD B〕 a3_b3 _123 YNC〕 for -abc Case D〕 2a DO sizeof4.假定一个二维数组的定义语句为“int a[3][4]={{3,4},{2,8,6}};〞,则元素a[2][1]的值为〔A〕。

A〕 0 B〕 4 C〕 8 D〕 65.以下情况中,哪一种情况不会调用拷贝构造函数〔 B 〕A〕用派生类的对象去初始化基类对象时B〕将类的一个对象赋值给该类的另一个对象时C〕函数的形参是类的对象,调用函数进展形参和实参结合时D〕函数的返回值是类的对象,函数执行返回调用者时6.以下哪一关键字可用于重载函数的区分〔C〕A〕e*tern B〕static C〕const D〕virtual7.以下有关数组的表达中,正确的选项是〔 B 〕A〕C++中数组的存储方式为列优先存储B〕数组名可以作为实参赋值给指针类型的形参C〕数组下标索引从1开场,至数组长度n完毕D〕数组指针的语法形式为:类型名 *数组名[下标表达式];8.以下有关继承和派生的表达中,正确的选项是( C )A〕派生类不能访问通过私有继承的基类的保护成员B〕多继承的虚基类不能够实例化C〕如果基类没有默认构造函数,派生类就应当声明带形参的构造函数D〕基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现9.实现运行时多态的机制是〔 A 〕A〕虚函数B〕重载函数C〕静态函数D〕模版函数10.假设有下面的函数调用:fun(a+b, 3, ma*(n-1, b));其中实参的个数是〔 A〕A〕3 B〕4 C〕5 D〕611.以下关于this指针的说确的是〔 B〕A〕this指针存在于每个函数之中B〕在类的非静态函数中this指针指向调用该函数的对象C〕this指针是指向虚函数表的指针D〕this指针是指向类的函数成员的指针12.在以下关于C++函数的表达中,正确的选项是〔C〕A〕每个函数至少要有一个参数B〕每个函数都必须返回一个值C〕函数在被调用之前必须先声明D〕函数不能自己调用自己13.以下运算符中,不能重载的是〔C〕A〕&& B〕!= C〕. D〕->14.下面程序的输出结果是〔B〕#include <iostream>using namespace std;int i = 0;int fun(int n){static int a = 2;a++;return a+n;}void main(){int k = 5;{int i = 2;k += fun(i);}k += fun(i);cout << k;}A〕13 B〕14 C〕15 D〕1615.下面的程序段的运行结果为〔D〕char str[] = "job", *p = str;cout << *(p+2) << endl;A〕98 B〕无输出结果 C〕字符’b’的地址 D〕字符’b’16.下面程序的输出结果是〔 C 〕#include <iostream>using namespace std;class A{public:A (int i) { * = i; }void dispa () { cout << * << “,〞; }private :int * ;};class B : public A{public:B(int i) : A(i+10) { * = i; }void dispb() { dispa(); cout << * << endl; }private :int * ;};void main(){B b(2);b.dispb();}A〕10,2 B〕12,10 C〕12,2 D〕2,217.下面程序的输出结果是〔 C〕#include <iostream>using namespace std;class Base{public:Base(int i) { cout << i; }~Base () { }};class Base1: virtual public Base{public:Base1(int i, int j=0) : Base(j) { cout << i; }~Base1() {}};class Base2: virtual public Base{public:Base2(int i, int j=0) : Base(j) { cout << i; }~Base2() {}};class Derived : public Base2, public Base1{public:Derived(int a, int b, int c, int d) : mem1(a), mem2(b), Base1(c), Base2(d), Base(a){ cout << b; }private:Base2 mem2;Base1 mem1;};void main() { Derived objD (1, 2, 3, 4); }A〕134122 B〕123412 C〕14302012 D〕14321218.下面程序的输出结果是〔C〕#include <iostream>using namespace std;class Base{public:virtual void f() { cout << “f0+〞; }void g() { cout << “g0+〞; }};class Derived : public Base{public:void f() { cout << “f+〞; }void g() { cout << “g+〞; }};void main() { Derived d; Base *p = &d; p->f(); p->g(); }A〕f+g+ B〕f0+g+ C〕f+g0+ D〕f0+g0+19.下面程序的输出结果是〔 C 〕#include <iostream>using namespace std;class Sample{friend long fun (Sample s){if (s.* < 2) return 1;return s.* * fun(Sample(s.*-1));}public:Sample (long a) { * = a; }private:long *;};void main(){int sum = 0;for (int i=0; i<4; i++){sum += fun(Sample(i));}cout << sum;}A〕12 B〕16 C〕10 D〕34 20.以下程序的输出结果是:〔D〕#include <iostream>using namespace std;int fun(char *s){ char *p=s;while (*p!='\0') p++;return (p-s);}void main(){cout<<fun("abc")<<endl;}A.0 B. 1 C. 2 D. 3 21.有如下程序段:int i=1;while(1){i++;if (i==10) break;if(i%2==0) cout<<’*’;}执行这个程序段输出字符*的个数是(C)A. 10B. 3C. 4D.522.以下关于虚基类的描述中,错误的选项是(C)A. 使用虚基类可以消除由多继承产生的二义性B. 构造派生类对象时,虚基类的构造函数只被调用一次C. 声明 class B:virtual public A 说明类B为虚基类D. 建立派生类对象时,首先调用虚基类的构造函数23.有下类定义Class A {Char *a;Public:A():a(0){}A(char *aa) {//把aa所指字符串拷贝到a所指向的存储空间A=___________________;Strcpy(a,aa);~A() {delete [] a;}};正确的选择是〔A〕A. new char[strlen(aa)+1]B. char[strlen(aa)+1]C. char[strlen(aa)]D. new char[sizeof(aa)-1]24.假定AA为一个类,a为该类私有的数据成员,GetValue( )为该类公有函数成员,它返回a的值,*为该类的一个对象,则访问*对象中数据成员a的格式为〔*〕。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、斐波那契数列
【问题描述】
斐波纳契数列0,1,1,2,3,5,8,13,21,34,55…从第三项起,每一项都是紧挨着的前两项的和。

写出计算斐波那数列任意一个数据项的递归程序。

【输入格式】
所求项数
【输出格式】
数据项的值
【输入样例】
10
【输出样例】
34
2、倒序数
【问题描述】
用递归算法写程序,输入一个非负整数,输出这个数的倒序数。

【输入格式】
一个非负整数
【输出格式】
倒序结果
【输入样例】
123
【输出样例】
321
3、十进制转换成八进制数
【问题描述】
用递归算法,把任一给定的十进制数转换成八进制数输出。

【输入格式】
一个正整数,表示需要转换的十进制数。

【输出格式】
一个正整数,表示转换之后的八进制数。

【输入样例】
15
【输出样例】
17
4、求n!的值
【问题描述】
用递归算法,求n!的精确值(n以一般整数输入)。

【输入样例】
10
【输出样例】
10!=3628800
5、求最大公约数
【问题描述】
用递归方法求两个正整数m和n的最大公约数。

(m>0,n>0)
【输入格式】
两个数,即m和n的值。

【输出格式】
最大公约数。

【输入样例】
8 6
【输出样例】
gcd=2
6、背包问题
【问题描述】
简单的背包问题,设有一个背包,可以放入的重量为s。

现有n件物品,质量分布为w1,为,…,wn(1≤i≤n),均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s。

找到一组解即可。

【输入格式】
第一行是物品总件数和背包的载重量,第二行为各物品的重量。

【输出格式】
各所选物品的序号和重量。

【输入样例】
5 10
1 2 3 4 5
【输出样例】
number:1 weight:1
number:4 weight:4
number:5 weight:5
7、2的幂次方
任何一个正整数都可以用2 的幂次方表示:
如137=2^7+2^3+2^0
同时约定用括号来表示次方即a^b可表示为a(b)
所以137可表示为
2(7)+2(3)+2(0)
进一步:7=2^2+2+2^0 (2^1用2 表示)
3=2+2^0
所以137可表示为:2(2(2)+2+2(0))+2(2+2(2(0))+2(0)
又如:1315=2^10+2^8+2^5+2+1
所以1315最后可表示为:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
【输入格式】
正整数(n<=20000)
【输出格式】
符合约定的n的0,2表示(在表示中不能有空格)
【输入样例】
137
【输出样例】
2(2(2)+2+2(0))+2(2+2(0))+2(0)
8、加法表
【问题描述】
著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。

例如:
+L K V E
L L K V E
K K V E KL
V V E KL KK
E E KL KK KV
其含义为:L+L=L,L+K=K,L+V=V,L+E=E,K+L=K,K+K=V,K+V=E,K+E=KL,……E+E=KV
根据这些规则可推导出:L=0,K=1,V=2,E=3
同时,可以确定该表表示的是4进制加法
【输入格式】
n(n<=9),表示行数,以下N行,每行N个字符串,每个字符串间用空格隔开。

(字串仅有一个为"+"号,其他都由大写字母组成)
【输出格式】
第一行是各个字母表示什么数,格式如:L=0,K=1,……
第二行表示加法运算是几进制的
若不可能组成加法表,则应输出"error!"
【输入样例】
3
+M L
M ML M
L M L
【输出样例】
M=1 L=0
2
9、数的计数
【问题描述】
我们要求找出具有下列性质的数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
①不作任何处理;
②它的左边加上一个自然数,但该自然数不能超过原数的一半;
③加上数后,继续按此规则进行处理,直到不能再加自然数为止.
【样例】输入: 6
满足条件的数为 6 (此部分不必输出)
16
26
126
36
136
输出: 6
10.集合划分问题
【问题描述】
n个元素的集合{1,2,…, n }可以划分为若干个非空子集。

例如,当n=4 时,集合{1,2,3,4}可以划分为15 个不同的非空子集如下:
{{1},{2},{3},{4}},
{{1,2},{3},{4}},
{{1,3},{2},{4}},
{{1,4},{2},{3}},
{{2,3},{1},{4}},
{{2,4},{1},{3}},
{{3,4},{1},{2}},
{{1,2},{3,4}},
{{1,3},{2,4}},
{{1,4},{2,3}},
{{1,2,3},{4}},
{{1,2,4},{3}},
{{1,3,4},{2}},
{{2,3,4},{1}},
{{1,2,3,4}}
其中,集合{{1,2,3,4}}由1 个子集组成;集合{{1,2},{3,4}},{{1,3},{2,4}},{{1,4},{2,3}},{{1,2,3},{4}},{{1,2,4},{3}},{{1,3,4},{2}},{{2,3,4},{1}}由2 个子集组成;集合{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4},{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}}由3 个子集组成;集合{{1},{2},{3},{4}}由4 个子集组成。

给定正整数n 和m,计算出n 个元素的集合{1,2,…n}可以划分为多少个不同的由m个非空子集组成的集合。

【输入格式】
输入数据的第1 行是元素个数n和非空子集数m。

【输出格式】
程序运行结束时,将计算出的不同的由m个非空子集组成的集合数输出。

【样例输入】
4 3
【样例输出】
6
11、双色Hanoi塔问题
【问题描述】
设A、B、C是3 个塔座。

开始时,在塔座A上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。

各圆盘从小到大编号为1,2,……,n,奇数号圆盘着红色,偶数号圆盘着蓝色,如图所示。

现要求将塔座A 上的这一叠圆盘移到塔座B上,并仍按同样顺序叠置。

在移动圆盘时应遵守以下移动规则:
规则(1):每次只能移动1个圆盘
规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则(3):任何时刻都不允许将同色圆盘叠在一起;规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C中任一塔座上。

试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B上,并仍按同样顺序叠置。

对于给定的正整数n,计算最优移动方案。

【输入格式】
输入数据只有1个整数,表示给定的正整数n(n≤10)。

【输出格式】
输出得到的最优移动方案由若干行组成,每一行由一个正整数k和2个字符c1和c2组成,中间均用空格分隔,表示将第k个圆盘从塔座c1移到塔座c2上。

【示例输入】
3
【示例输出】
1 A B
2 A C
1 B C
3 A B
1 C A
2 C B
1 A B。

相关文档
最新文档