递归专题训练
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
则以该数字为矩阵的大小,把 1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例 如:输入数字 2,则程序输出: 12 43 输入数字 3,则程序输出: 123 894 765 输入数字 4, 则程序输出: 1 2 3 4
12 13 14 5 11 16 15 6 10 9 8 7 (Tips :定义如下递归函数 loopmatrix (int n, int startnu百度文库ber, int location)。n 代 表对 n*n 的矩阵赋值, startnumber 代表赋值开始数字,location 代表当前矩阵的左 上角位置。 那么递归函数可以先完成最外围位置的赋值,然后递归调用: loopmatrix (n-2, startnumber+4*n-2, location + 1))
轻工学院计算机系网络班
蓝桥杯 递归专题训练
2014-12-26
void hanoi(int n, char src, char mid, char dest ) { if( n > 0 ) { hanoi( n-1, src, dest, mid ); printf(“%c->%c\n”, src, dest); hanoi( n-1, mid, src, dest ); } } 再如,规模为 n 的序列的排序问题,可以分解成以下两个步骤 1. 先找出最大的元素,然后和序列最后一个元素交换。 2. 完成序列前 n-1 的元素的排序。( 规模为 n-1 的序列的排序问题 ) 因此,n 元素的排序问题可以用以下递归程序实现: void swap(int *a,int *b) { int tmp = *a; *a = *b; *b = tmp; } void sort(int a[] , int n) { int i , max_idx = 0; for(i=1;i<n;i++) if(a[i] > a[max_idx]) max_idx = i; swap(&a[n-1] , &a[max_idx]); if(n-1 >= 2) sort(a, n-1); }
轻工学院计算机系网络班
蓝桥杯 递归专题训练
2014-12-26
6.
编写程序输入不同的 rank,输出相应图形,如下所示:
二.
什么问题可以用递归程序实现?
如果一个问题在输入规模为 n 的时候 的解决方案 包含了输入规模为 k(k < n)的问题的解决方案,一般来说,可以使用递归程序来解决该问题。
例如,求阶乘。求 n 的阶乘这个问题,可以分解成两步: 1.求 n-1 的阶乘。 2.第一步的结果再乘以 n。 因此求阶乘这个问题可以用一下递归程序实现: int fac ( int n) { if( n == 1) return 1; else return n * fac(n-1) ; }
轻工学院计算机系网络班
蓝桥杯 递归专题训练
2014-12-26
5.
(十字图) 小明为某机构设计了一个十字型的徽标(并非红十字会啊),输入 4, 输出图 如下所示:
输入的 n 代表十字符号外的圈数。 (Tips :定义如下递归函数 pic (int n, int location)完成图符赋值。n 代表对 n 圈图 符,location 代表最外圈圈位置。 那么递归函数可以先完成最外圈赋值,然后递归调 用: pic (n-1, location + 2) )。
轻工学院计算机系网络班
蓝桥杯 递归专题训练
2014-12-26
三.
编写递归程序的一般方法 用递归程序来求解某个问题,最关键的就是需要把 待求解的问题在输入为 n 的时候的求解 过程 分解成若干步骤,其中某一个或某几个 步骤 是 求解 同一 问题(但这时输入的规模必须小于 n)。在递归调用的时候,往需要传递某些 参数。如何确定这些参数是至关重要的问题。 以 练习题 3(回旋矩阵)为例: 该问题是需要旋转打印 n*n 的矩阵。注意到 要直接打印是非常困难的,因此考虑 对 n*n 的矩阵用一个 n*n 的数组保存, 先对该数组赋值然后再打印。对 n*n 的该矩阵赋值可以分成以下步骤: 1、 2、 对最外围圈的数组元素赋值 对(n-1)*(n-1)的矩阵赋值。这时需要传递 以下参数:问题的规模, 用于赋值的起始值,接收赋值的起始元素的下标。 因此该问题的求解可用以下递归程序实现 loopmatrix (int n, int startnumber, int location) { 1. 用 startnumber startnumber+n-1 对 a[location] [location]- a[location] [location+n-1]依次赋值 (第一行)
又如,规模为 n 的汉诺塔问题:n 个盘子需要借助中间位置 mid 从原位置 src 移到目标位置 dest 。可以分解成 3 步: 1. 先将 n-1 个盘子从 src 借助 c 移到 mid;(规模为 n-1 的汉诺塔问题) 2.最下面一个盘子从 src 移到 dest; 3.将 n-1 个盘子从 mid 借助 src 移到 dest。(规模为 n-1 的汉诺塔问题) 因此求阶乘这个问题可以用一下递归程序实现:
2. 用 startnumber+nstartnumber+2*n-2 对 a[location+1][location+n-1] a[location+n-1][location+n-1] 依次 赋值 (最后一列) 3. 。。。(最后一行) 4. 。。。(第一列) 5. if(n-2 >= 1) (递归调用)
loopmatrix(n-2, startnumber + 4*n-4, location + 1); }
轻工学院计算机系网络班
蓝桥杯 递归专题训练
2014-12-26
四.
递归练习题
1. 2. 3. 4.
(累加)用递归函数求 1+2+3+….+n (折半查找) 用递归程序实现折半查找 (快速排序) 用递归程序实现快速排序 (回旋矩阵)从键盘输入一个整数(1~20)
轻工学院计算机系网络班
蓝桥杯 递归专题训练
2014-12-26
一.
什么是递归? 简单来讲,一个函数 自己 调用自己 叫递归调用。递归是一种常用的算法实现 方法。实现起来简单,但是效率相对较低,因为需要频繁的函数调用。分治法, 深度优先搜索,广度优先搜索,回溯法,贪心法,动态规划法等常用算法均可 以用递归程序来实现。