算法设计王茂林.docx
- 文档编号:3782504
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:20
- 大小:90.25KB
算法设计王茂林.docx
《算法设计王茂林.docx》由会员分享,可在线阅读,更多相关《算法设计王茂林.docx(20页珍藏版)》请在冰豆网上搜索。
算法设计王茂林
实验一递归与分治
姓名:
王茂林
班级:
信息1411
学号:
2014125104
指导老师:
潘老师
实验目的:
理解递归与分治算法设计思想和方法。
实验课时:
4学时
实验原理:
一个规模为n的复杂问题的求解:
可以划分成若干个规模较小 若划分成的每一个子问题都与原问题的性质相同,可用相同的求解方法;当子问题规模划分一定小时,子问题的解已知,则逆求原问题的解,这是递归的思想。 实验题目: 1、汉诺塔(hanoi)问题。 设有A、B、C共3根塔座,在塔座A上堆叠n个金盘,每个盘大小不同,只允许小盘在大盘之上,最底层的盘最大,如下图所示。 现在要求将A上的盘全都移到C上,在移的过程中要遵循以下原则: 每次只能移动一个盘;圆盘可以插在A、B和C任一个塔座上;在任何时刻,大盘不能放在小盘的上面。 hanoi问题递归求解思想: 我们把一个规模为n的hanoi问题: 1到n号盘按照移动规则从A上借助B移到C上表示为H(A,B,C,n);原问题划分成如下三个子问题: (1)将1到n-1号盘按照移动规则从A上借助C移到B上H(A,C,B,n-1); (2)将n号盘从A上直接移到C上; (3)将1到n-1号盘按照移动规则从B上借助A移到C上H(B,A,C,n-1); 经过三个子问题求解,原问题的也即求解完成。 hanoi问题递归求解代码: voidH(charA,charB,charC,intn) { if(n>0) { H(A,C,B,n-1); printf(“%dfrom%cto%c”,n,A,C); H(B,A,C,n-1); } } -c语言实验代码: #include voidhanoi(intn,charX,charY,charZ) { if(n==1) printf("把%c移动到%c\n",X,Z); else {hanoi(n-1,X,Z,Y); printf("把%c移动到%c\n",X,Z); hanoi(n-1,Y,X,Z); } } main() { intm; printf("请输入盘子的数目: "); scanf("%d",&m); printf("要移动的盘子执行的步骤为: %d\n",m); hanoi(m,'A','B','C'); } 实验结果: 2、二分查找问题 (1)设a[0: n-1]是一个已排好序的数组。 请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。 *********************************************************** 代码显示: #include intbinarySearch(inta[],intn,intx,int&i,int&j)//a[]为要搜索的数组;n为数组元素的个数;x为要查询的元素值; //i为小于x的最大元素位置;j为大于x的最小元素的位置 { intmiddle;//中值 intright=n-1;//数组的右边界 intleft=0;//数组的左边界 while(left<=right) { middle=(left+right)/2; if(x==a[middle]) { i=j=middle; returnmiddle; } if(x>a[middle]) left=middle+1; else//2016年11月3日测试成功。 right=middle-1; i=right; j=left; } return-1;//查询失败 } intmain(void) { inti; intj; intmiddle; intb[]={1,2,3,4,5,6,7,8,12,22};//用来测试的数组 middle=binarySearch(b,10,13,i,j);//调用二分搜索算法 if(middle! =-1)//查询成功 { printf("thex'spositionis: %d,iis%d,jis%d\n",middle,i,j); } else//查询失败 { printf("找不到这个元素: %d,jis%d\n",i,j); } return0; } 结果显示: 方法二: 如果存在,必须返回下标 #include usingnamespacestd; constintSIZE=12; intbinarySearch(intArray[],intx,intn,int&a,int&b) { intleft=0; intright=n-1; intmiddle; while(left<=right) { middle=(left+right)/2; if(x==Array[middle]) { a=b=middle; return0; } if(x>Array[middle]) left=middle+1; else right=middle-1; } a=right; b=left; return1; } intmain()//于16年11月3日测试成功 { inta,b; intt; intArray[SIZE]={1,4,7,10,23,33,36,65,76,87,89,90}; cout<<"请输入要搜索的元素: "; cin>>t; if(binarySearch(Array,t,SIZE,a,b)==0) { cout<<"查找的元素存在! "< "< } else { cout<<"查找的元素不存在! "< <<"大于X的最小元素的位置为: "< <<"小于X的最大元素位置为: "< } return0; } 当输入元素存在时的下标显示: 当输入结果不存在时,回馈最大最小元素 (2)设有n个不同的整数排好序后存放于t[0: n-1]中,若存在一个下标i,0≤i<n,使得t[i]=i,设计一个有效的算法找到这个下标。 要求算法在最坏的情况下的计算时间为O(logn)。 boolBinarySearch(inta[],intn,intx,int&i,int&j) { intleft=0; intright=n-1; while(left { intmid=(left+right)/2; if(x==a[mid]) { i=j=mid; returntrue; } if(x>a[mid]) left=mid+1; else right=mid-1; } i=right; j=left; returnfalse; } intSearchTag(inta[],intn,intx) { intleft=0; intright=n-1; while(left { intmid=(left+right)/2; if(x==a[mid])returnmid; if(x>a[mid]) right=mid-1; else left=mid+1; } return-1; } ********************************************************************* 代码实现: #include #defineN10 boolBinarySearch(inta[],intn,intx,int&i,int&j) { intleft=0; intright=n-1; while(left { intmid=(left+right)/2; if(x==a[mid]) { i=j=mid; returntrue; } if(x>a[mid]) left=mid; else right=mid; } i=right; j=left; returnfalse; } intSearchTag(inta[],intn) { intleft=0; intright=n-1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 王茂林