递归与分治相关实验及代码

合集下载

python递归实验报告

python递归实验报告

python递归实验报告Python递归实验报告引言:递归是计算机科学中一种重要的编程技术,它在解决问题时能够简化代码逻辑,并提高代码的可读性和可维护性。

Python作为一种高级编程语言,提供了强大的递归支持,本文将通过实验来探讨Python递归的特性和应用。

一、递归的概念与原理递归是一种通过调用自身的方式解决问题的方法。

在递归过程中,问题被分解为更小的子问题,直到子问题足够简单可以直接求解。

递归的基本原理是将一个大问题转化为一个或多个与原问题相似但规模更小的子问题,通过递归调用解决子问题,最终得到原问题的解。

二、递归的实现方式在Python中,递归可以通过函数调用自身来实现。

递归函数通常包含两个部分:基准情况和递归情况。

基准情况是递归函数的结束条件,当满足基准情况时,递归函数将不再调用自身,而是返回一个特定的值。

递归情况是指递归函数在未满足基准情况时,调用自身来处理更小规模的子问题。

三、递归的应用场景1. 阶乘计算阶乘是指从1到给定数之间所有整数的乘积。

递归可以很方便地实现阶乘计算,如下所示:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n-1)```2. 斐波那契数列斐波那契数列是指从第三项开始,每一项都等于前两项之和。

递归可以很容易地实现斐波那契数列的计算,如下所示:```pythondef fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)```3. 文件夹遍历递归还可以用于文件夹的遍历,通过递归调用实现对文件夹内所有文件的查找和处理。

例如,可以编写一个函数来计算指定文件夹下所有文件的总大小:```pythonimport osdef get_folder_size(folder):size = 0for item in os.listdir(folder):item_path = os.path.join(folder, item)if os.path.isfile(item_path):size += os.path.getsize(item_path)elif os.path.isdir(item_path):size += get_folder_size(item_path)return size```四、递归的优缺点递归的优点在于能够简化问题的解决过程,提高代码的可读性和可维护性。

递归与分治实验报告

递归与分治实验报告

递归与分治实验报告班级:计科1102 姓名:赵春晓学号:2011310200631实验目的:进一步掌握递归与分治算法的设计思想,通过实际问题来应用递归与分治设计算法。

实际问题:1集合划分问题,2输油管道问题,3邮局选址问题,4整数因子分解问题,5众数问题。

问题1:集合划分算法思想:对于n个元素的集合,可以划分为由m个子集构成的集合,例如{{1,2}{3,4}}就是由2个子集构成的非空子集。

假设f(n,m)表示将n个元素划分成由m个子集构成的集合的个数。

那么1)若m == 1 ,则f(n,m)= 1 ;2)若n == m ,则f(n,m)= 1 ;3)若不是上面两种情况则有下面两种情况构成:3.1)向n-1个元素划分成的m个集合里面添加一个新的元素,则有m*f(n-1,m)种方法;3.2)向n-1个元素划分成的m-1个集合里添加一个由一个元素形成的独立的集合,则有f(n-1,m-1)种方法。

实验代码:#include<iostream>#include<fstream>using namespace std ;int jihehuafen( int n , int m ){if( m == 1 || n == m )return 1 ;elsereturn jihehuafen( n - 1 , m - 1 ) + m*jihehuafen( n - 1 , m ) ;}int main(){ifstream fin("C:/input.txt") ;ofstream fout("C:/output.txt") ;int N , M , num ;fin >> N >> M ;num = jihehuafen( N , M) ;fout << num << endl ;return 0 ;}问题2:输油管道算法思想:由于主管道由东向西铺设。

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。

1、求n个元素的全排。

(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。

(30分)3、设有n=2k个运动员要进行网球循环赛。

设计一个满足要求的比赛日程表。

(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。

三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。

递归算法及经典递归例子代码实现

递归算法及经典递归例子代码实现

递归算法及经典递归例子代码实现递归算法是一种在函数体内调用函数本身的算法。

通过递归,问题可以被分解为规模更小的子问题,直到达到基本情况,然后将所有的子问题的解合并起来,得到原始问题的解。

递归算法的实现通常包含两个要素:基本情况和递归调用。

基本情况是指不能再进一步分解的情况,一般是针对问题的最小输入。

递归调用是指在解决子问题之后,将问题规模缩小,然后调用自身来解决更小规模的问题。

下面将介绍三个经典的递归例子,并给出相应的代码实现。

1.阶乘计算:阶乘是指从1到给定的数字n之间所有整数的乘积。

它是递归问题的经典例子之一```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)```在阶乘的递归实现中,基本情况是n等于0时,返回1、递归调用是将问题规模变为n-1,然后将得到的结果与n相乘。

通过递归调用,可以一直计算到n为1,然后将每个阶乘结果逐步合并返回,最终得到n的阶乘。

2.斐波那契数列:斐波那契数列是指从0和1开始,后续的数字都是前两个数字之和。

```pythondef fib(n):if n <= 0:return 0elif n == 1:return 1else:return fib(n - 1) + fib(n - 2)```在斐波那契数列的递归实现中,基本情况是n小于等于0时返回0,n等于1时返回1、递归调用是将问题规模分为两个子问题,分别计算n-1和n-2的斐波那契数,然后将两个子问题的结果相加返回。

通过递归调用,可以一直计算到n为0或1,然后将每个斐波那契数逐步合并返回,最终得到第n个斐波那契数。

3.二叉树遍历:二叉树遍历是指按照一定的顺序访问二叉树的所有节点。

```pythonclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef inorderTraversal(root):if root is None:return []else:return inorderTraversal(root.left) + [root.val] + inorderTraversal(root.right)```在二叉树的中序遍历的递归实现中,基本情况是判断当前节点是否为空,如果为空则返回一个空列表。

递归的实验报告

递归的实验报告

一、实验目的1. 理解递归算法的基本概念和原理;2. 掌握递归算法的设计方法;3. 通过实际案例,加深对递归算法的理解和应用;4. 提高编程能力,为解决实际问题打下基础。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 编译器:Visual Studio 2019三、实验内容1. 实现斐波那契数列的递归算法;2. 实现汉诺塔问题的递归算法;3. 实现二分查找问题的递归算法;4. 实现回文问题的递归算法。

四、实验步骤1. 斐波那契数列的递归算法(1)定义斐波那契数列的递归函数;(2)调用递归函数,计算指定项的斐波那契数。

2. 汉诺塔问题的递归算法(1)定义汉诺塔问题的递归函数;(2)调用递归函数,完成汉诺塔问题的求解。

3. 二分查找问题的递归算法(1)定义二分查找问题的递归函数;(2)调用递归函数,在有序数组中查找指定元素。

4. 回文问题的递归算法(1)定义回文问题的递归函数;(2)调用递归函数,判断字符串是否为回文。

五、实验结果与分析1. 斐波那契数列的递归算法实验结果:成功实现斐波那契数列的递归算法,可以计算指定项的斐波那契数。

分析:递归算法在计算斐波那契数列时,存在重复计算的问题,导致效率低下。

可以通过使用记忆化递归或动态规划的方法来优化算法。

2. 汉诺塔问题的递归算法实验结果:成功实现汉诺塔问题的递归算法,可以完成汉诺塔问题的求解。

分析:递归算法在解决汉诺塔问题时,通过递归地将问题分解为更小的子问题,最终实现整个问题的解决。

递归算法具有简洁明了的特点,但需要特别注意递归的结束条件。

3. 二分查找问题的递归算法实验结果:成功实现二分查找问题的递归算法,可以在有序数组中查找指定元素。

分析:递归算法在解决二分查找问题时,通过递归地将问题分解为更小的子问题,每次都将搜索范围缩小一半,从而提高查找效率。

递归算法在处理大数据量时具有较好的性能。

4. 回文问题的递归算法实验结果:成功实现回文问题的递归算法,可以判断字符串是否为回文。

递归与分治算法设计

递归与分治算法设计

实例:
1)
2)
总结
实验心得体会: 通过该试验,我掌握递归与分治策略 的基本思想,并通过设计求解给定问题的 递归算法和分治算法,学会使用递归和分 治法解决问题的一般技巧。 改进意见: 应学会熟练使用递归和分治法解决该 问题,认真学习递归分治策略的思想,还 有就是多练习用分治来解决一些实际问题 对于更好地掌握分治是有很大帮助的。要 掌握它,我还要多练习写这方面的程序。 指导教师:
ห้องสมุดไป่ตู้
} public static void main(String[] args) { int []a = new int[]{2,3,4,5,6,8,9}; //0 1 2 3 4 5 6 Scanner scn = new Scanner(System.in); int x = scn.nextInt(); int m = new Digui().binarySearch(a, x,0,a.length-1); if(a[m]==x){ System.out.println("与x相等的数据元素的下 标是"+ m); }else{ System.out.println("不存在" + x); if(a[m]>x){ System.out.println("比x大的最小数组元素 的下标是" + m); if((m-1)<0){ System.out.println("不存在比x小的数组 元素"); } }else{ System.out.println("比x小的最大数组元素 的下标是" + m); if(m >= a.length-1){ System.out.println("不存在比x大的数组 元素"); }else{ System.out.println("比x大的最小数组元 素的下标是" + (m +1)); } } } }

算法之2章递归与分治

算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。

用函数自身给出定义的函数称为递归函数。

2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。

在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。

这自然导致递归过程的产生。

分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。

3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。

(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。

4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。

缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。

实验一--分治与递归算法的应用

实验一分治与递归算法的应用一、实验目的1.掌握分治算法的基本思想(分-治-合)、技巧和效率分析方法。

2.熟练掌握用递归设计分治算法的基本步骤(基准与递归方程)。

3.学会利用分治算法解决实际问题。

二、问题描述金块问题老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。

假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。

并对自己的程序进行复杂性分析。

3、问题分析一般思路:假设袋中有n 个金块。

可以用函数M a x,通过n-1次比较找到最重的金块。

找到最重的金块后,可以从余下的n-1个金块中用类似法通过n-2次比较找出最轻的金块。

这样,比较的总次数为2n-3。

分治法:如果集合中只有1个元素,则它既是最大值也是最小值;如果有2个元素,则一次maxnum(i,j) 一次minnum(i,j)就可以得到最大值和最小值;如果把集合分成两个子集合,递归的应用这个算法分别求出两个子集合的最大值和最小值,最后让子集合1的最大值跟子集合2的最大值比较得到整个集合的最大值;让子集合1的最小值跟子集合2的最小值比较得到整个集合的最小值。

四、程序设计对金块问题的程序设计如下:(1)核心算法分析double Search_Max(double g[],int left,int right)与double Search_Min(double g[],int left,int right)函数分别是求最大重量与最小重量金块的被调用函数,函数体中当left==right时,只有一个重量,最小和最大重量相等,分别直接返回返回g[left],g[right]。

当right-left==1时,有两个重量,分别调用一次min(g1,g2)和max (g1,g2)函数就可得出最小与最大重量,分别返回。

当right-left>1时,mid=(left+right)/2取中点,将数据群分为两半,分别递归调用,最后将得到的两个数据群的最值运用min()或max()函数得到最小最大重量。

递归算法及经典递归例子代码实现

递归算法及经典递归例⼦代码实现递归(recursion):程序调⽤⾃⾝的编程技巧。

递归满⾜2个条件:1)有反复执⾏的过程(调⽤⾃⾝)2)有跳出反复执⾏过程的条件(递归出⼝)递归例⼦:(1)阶乘n! = n * (n-1) * (n-2) * ...* 1(n>0)//阶乘int recursive(int i){int sum = 0;if (0 == i)return (1);elsesum = i * recursive(i-1);return sum;}(2)河内塔问题//河内塔void hanoi(int n,int p1,int p2,int p3){if(1==n)cout<<"盘⼦从"<<p1<<"移到"<<p3<<endl;else{hanoi(n-1,p1,p3,p2);cout<<"盘⼦从"<<p1<<"移到"<<p3<<endl;hanoi(n-1,p2,p1,p3);}}(3)全排列从n个不同元素中任取m(m≤n)个元素,按照⼀定的顺序排列起来,叫做从n个不同元素中取出m个元素的⼀个排列。

当m=n时所有的排列情况叫全排列。

如1,2,3三个元素的全排列为:1,2,31,3,22,1,32,3,13,1,23,2,1//全排列inline void Swap(int &a,int &b){int temp=a;a=b;b=temp;}void Perm(int list[],int k,int m){if (k == m-1){for(int i=0;i<m;i++){printf("%d",list[i]);}printf("n");}else{for(int i=k;i<m;i++){Swap(list[k],list[i]);Perm(list,k+1,m);Swap(list[k],list[i]);}}}(4)斐波那契数列斐波纳契数列,⼜称黄⾦分割数列,指的是这样⼀个数列:1、1、2、3、5、8、13、21、……这个数列从第三项开始,每⼀项都等于前两项之和。

实验2 递归算法实验

实验2 递归算法实验
实验内容
1. 使用递归编写一个程序,求以下数列的前n 项之和:
n
s 1...61514131211++-+-+-=
时,结果为 55 当n=15时,结果为 610 。

2. 编写一个程序,使用递归算法输出一个一维字符数组中所有字符的全排列,假设字符都不一样,例如{'a','b','c'}的全排列为(a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)。

3. 编写一个程序,使用递归函数计算一个正整数中所有数字之和,例如输入234,输出9。

4*. 编写一个递归函数,返回一个字符串中大写字母的数目。

源代码:
说明:
(1) 编程语言不限,建议使用Java、C++或者C语言。

(2) 需要将程序源代码复制并粘贴到每道题之后的方框中(部分题需要填写输出结果)。

(3) 在提交实验报告时,先关闭所有文件,再将文件名改为“学号-2.doc”,上传到“13级计算机班/算法分析与设计”文件夹中的“实验2”子文件夹中。

(4) 标注“*”号的题为选做题,其他题为必做题。

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

0 实验目的: 掌握递归与分治算法的基本原理和应用以及软件实现。 实验准备:

1. 在开始本实验之前,请回顾教科书的相关内容; 2. 需要一台准备安装Windows XP Professional操作系统和装有VC++6.0的计算机。 实验内容及要求 内容:完成递归与分治常见实例的实现。 要求: 1,熟悉C++的相关语法和编制独立的子程序。 2,输入多组数据都能够给出正确的结果。 实验过程: 1.1问题分析 递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。一般通过函数或子过程来实现,在函数或子过程的内部,直接或者间接地调用自己的算法。该算法具有以下特点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。该算法所体现的“重复”一般有三个要求: 一是每次调用在规模上都有缩减; 二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备; 三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。 通常该算法的时间复杂度很大,所以要在适当的条件下使用。在该实验中,采用递归算法得到的算法有:阶乘,斐波拉齐,数的排列等。 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解,就可得到原问题的解。利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是经常采用的一种有效的方法,例如二分法检索。分治法解题的一般步骤: (1)分解,将要解决的问题划分成若干个规模较小的同类问题; (2)求解,当子问题划分得足够小时,用较简单的方法解决; 1

(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。 在该实验中,使用分治算法得到的程序有棋盘覆盖、二分法检索、合并排序、快速排序、循环赛日程表。 1.2 核心代码 1、阶乘

阶乘函数的递归的定义是 10!(1)!0nnnnn,从定义可知,递归的出口时当n==0时,程序结束。程序如下: #include using namespace std; int jiecheng(int n) { if (n==0) return 1; if(n>0) {return n*jiecheng(n-1);} } int main() { int m,a; cin>>m; a=jiecheng(m);cout<}

从得到的实验数据分析,该数据只能针对数据较小的数成立,如果将数据定义为整数型,则只能计算20以下的数的阶乘,如果将数定义为100或者1000以上,则需要根据大数定理来做此问题。相对来说比较复杂,在此就不做讨论。 2、斐波拉齐 若有无穷数列1,1,2,3,5,8,13,21,34,55,„,则被称为Fibonacci数列。它可以递归地定义为:

10()11(1)(2)1nFnnFnFnn





做该实验,需要定义两个函数出口,则当n==0且n==1时,递归调用结束;程序结束。程序如下: #include using namespace std; int main() { int n,m; cout<<"输入:"<>n; int diguifblq(int n); for(int i=1;i<=n;i++) { m=diguifblq(i); cout<} cout

int diguifblq(int n) 1

{ if(n<=1) return 1; else return diguifblq(n-1)+diguifblq(n-2); }

从得到的实验数据分析,该递归调用函数在n<=1时调用结束,返回数据为1,;输入的数据是16,则需要将前16项的数据依次两两相加得到。 3、二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列或者将序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。该实验是典型的分治算法,即将规模逐步减小得到。实验程序如下: #include #include #include using namespace std; int main () { int x,n,i; cout<<"输入需要操作数的个数:"; cin>>n; vector a(n); int left=0; int right=n-1; int d; cout<<"输入所有的数:"; for(i=0;i>a[i]; sort(a.begin(),a.end()); //调用排序函数,对输入的数据进行排序; cout<<"输出排序后的数:">x; while(a[left]<=a[right]) //查找数 { int d=(right+left)/2; if(x==a[d]) {cout<<"已经找到"<<"该数的位置是:"a[d]) { left=d+1; } else right=d-1; } cout<<"没有找到"

从得到的数据上分析,先输入需要操作的数据个数,再随机输入数据,因为二分排序是针对已排好序的数据,所以可以直接输入有序的数据,也可以随机输入再对数据进行排序,在此程序中,为了简化程序,直接调用C中得排序函数:sort(a.begin(),a.end());再需要出招的数据输入,直接将数据排序后的位置输出。若没有找到该数据,直接输出‘没有找到’即可。 4、棋盘覆盖 在一个2k×2k (k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4k种,因而有4k种不同的棋盘,左图所示是k=2时16种棋盘中的一个。棋盘覆盖问题要求用右图所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

棋盘覆盖主要应用分治法求解,分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。k>0时,可将2k×2k的棋盘划分为4个2k-1×2k-1的子棋盘,如左图所示。这样划分后,由于原棋盘只有一个特殊方格,所以,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。为了将这3个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如右图所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。棋盘覆盖的数据结构设计为:(1)棋盘,直接用一个二维数组表示一个棋盘,其中棋盘的大小为2k;(2)子棋盘;(3)特殊方格;(4) L型骨牌:一个2k×2k的棋盘中有一个特殊方格,所以,用到L型骨牌的个数为(4k-1)/3。实验程序如下: #include #include using namespace std; int t=1; 1

int aa[1000][1000]; void ma(int x1,int y1,int x2,int y2,int size) { if(size==1) return; int w=t++; int s; s=size/2; if(x2=x1+s&&y2=y1+s) ma(x1,y1+s,x2,y2,s); else { aa[x1+s-1][y1+s]=w; ma(x1,y1+s,x1+s-1,y1+s,s); } if(x2>=x1+s&&y2>=y1+s) ma(x1+s,y1+s,x2,y2,s); else { aa[x1+s][y1+s]=w; ma(x1+s,y1+s,x1+s,y1+s,s); } } int main() { int size,x2,y2; cout<<"请输入棋盘的大小size:"; cin>>size; cout<<"请输入特殊方格的横坐标x2:"; cin>>x2; cout<<"请输入特殊方格的纵坐标y2:"; cin>>y2; ma(0,0,x2,y2,size); for(int i=0;i{ for(int j=0;jcout

从得到的实验上分析,输入的是一个8行8列的骨牌特殊地方的骨牌是5行6列位置,因为C++中数组的的下标是从0 开始的,所以输入的方格的横纵坐标分别是4和5,特殊骨牌的标记符号是0。 5、合并排序 合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。其思想是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个

相关文档
最新文档