算法设计与分析习题解答

合集下载

算法设计与分析习题答案

算法设计与分析习题答案

算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。

以下是一些典型的算法设计与分析习题及其答案。

习题1:二分查找算法问题描述:给定一个已排序的整数数组,编写一个函数来查找一个目标值是否存在于数组中。

答案:二分查找算法的基本思想是将数组分成两半,比较中间元素与目标值的大小,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找。

这个过程会不断重复,直到找到目标值或搜索范围为空。

```pythondef binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return Trueelif arr[mid] < target:low = mid + 1else:high = mid - 1return False```习题2:归并排序算法问题描述:给定一个无序数组,使用归并排序算法对其进行排序。

答案:归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。

```pythondef merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [38, 27, 43, 3, 9, 82, 10]merge_sort(arr)print("Sorted array is:", arr)```习题3:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。

算法设计与分析王晓东

算法设计与分析王晓东

习题2-1 求下列函数的渐进表达式:3n^2+10n; n^2/10+2n; 21+1/n; logn^3; 10 log3^n 。

解答:3n^2+10n=O(n^2),n^2/10+2^n=O(2^n),21+1/n=O(1),logn^3=O(logn),10log3^n=O(n).习题2-3 照渐进阶从低到高的顺序排列以下表达式:n!,4n^2,logn,3^n,20n,2,n^2/3。

解答:照渐进阶从高到低的顺序为:n!、3^n、4n^2 、20n、n^2/3、logn、2习题2-4(1)假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。

在某台计算机上实现并完成该算法的时间为t秒。

现有另外一台计算机,其运行速度为第一台计算机的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(2)若上述算法的计算时间改进为T(n)=n^2,其余条件不变,则在新机器上用t秒时间能解输入规模多大的问题?(3)若上述算法的计算时间进一步改进为,其余条件不变,那么在新机器上用t秒时间能解输入规模多大的问题?解答:(1)设能解输入规模为n1的问题,则t=3*2^n=3*2^n/64,解得n1=n+6(2)n1^2=64n^2得到n1=8n(3)由于T(n)=常数,因此算法可解任意规模的问题。

习题2-5 XYZ公司宣称他们最新研制的微处理器运行速度为其竞争对手ABC公司同类产品的100倍。

对于计算复杂性分别为n,n^2,n^3和n!的各算法,若用ABC公司的计算机能在1小时内能解输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的问题?解答:n'=100nn'^2=100n^2得到n'=10nn'^3=100n^3得到n'=4.64nn'!=100n!得到n'<n+log100=n+6.64习题2-6对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。

计算机算法设计和分析习题及答案解析

计算机算法设计和分析习题及答案解析

计算机算法设计和分析习题及答案解析This manuscript was revised on November 28, 2020《计算机算法设计与分析》习题及答案一.选择题1、二分搜索算法是利用( A )实现的算法。

A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是( A )。

A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是(A )的一搜索方式。

A、分支界限法B、动态规划法C、贪心法D、回溯法4. 回溯法解旅行售货员问题时的解空间树是( A )。

A、子集树B、排列树C、深度优先生成树D、广度优先生成树5.下列算法中通常以自底向上的方式求解最优解的是(B )。

A、备忘录法B、动态规划法C、贪心法D、回溯法6、衡量一个算法好坏的标准是( C )。

A 运行速度快B 占用空间少C 时间复杂度低D 代码短7、以下不可以使用分治法求解的是( D )。

A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题8. 实现循环赛日程表利用的算法是(A )。

A、分治策略B、动态规划法C、贪心法D、回溯法9.下面不是分支界限法搜索方式的是(D )。

A、广度优先B、最小耗费优先C、最大效益优先D、深度优先10.下列算法中通常以深度优先方式系统搜索问题解的是(D )。

A、备忘录法B、动态规划法C、贪心法D、回溯法11.备忘录方法是那种算法的变形。

( B )A、分治法B、动态规划法C、贪心法D、回溯法12.哈夫曼编码的贪心算法所需的计算时间为(B )。

A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)13.分支限界法解最大团问题时,活结点表的组织形式是(B )。

A、最小堆B、最大堆C、栈D、数组14.最长公共子序列算法利用的算法是(B)。

A、分支界限法B、动态规划法C、贪心法D、回溯法15.实现棋盘覆盖算法利用的算法是(A )。

A、分治法B、动态规划法C、贪心法D、回溯法16.下面是贪心算法的基本要素的是(C )。

算法设计与分析习题答案1-6章

算法设计与分析习题答案1-6章
{
mid=(low+high)/2;
if (k<r[mid])high=mid-1;
elseif (k>r[mid]) low=mid+1;
else return mid;
}
return 0;
}
2.请写出折半查找的递归算法,并分析时间性能。
求两个正整数m和n的最小公倍数。(提示:m和n的最小公倍数lcm(m,n)与m和n的最大公约数gcd(m,n)之间有如下关系:lcm(m,n)=m×n/gcd(m,n))
设计递归算法生成n个元素的所有排列对象。
#include <iostream>
using namespace std;
int data[100];
设计分治算法求解一维空间上n个点的最近对问题。
参见4.4.1最近对问题的算法分析及算法实现
9. 在有序序列(r1,r2, …,rn)中,存在序号i(1≤i≤n),使得ri=i。请设计一个分治算法找到这个元素,要求算法在最坏情况下的时间性能为O(log2n)。
习题6
1.动态规划法为什么都需要填表如何设计表格的结构
在填写表格过程中,不仅可以使问题更加清晰,更重要的是可以确定问题的存储结构;
设计表格,以自底向上的方式计算各个子问题的解并填表。
2. 对于图所示多段图,用动态规划法求从顶点0到顶点12的最短路径,写出求解过程。
将该多段图分为四段;
首先求解初始子问题,可直接获得:
七桥问题属于一笔画问题。
输入:一个起点
输出:相同的点
1,一次步行
2,经过七座桥,且每次只经历过一次
3,回到起点
该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。另一类是只有二个奇点的图形。

(整理)《计算机算法-设计与分析导论》课后习题答案.

(整理)《计算机算法-设计与分析导论》课后习题答案.

4.1:在我们所了解的早期排序算法之中有一种叫做Maxsort 的算法。

它的工作流程如下:首先在未排序序列(初始时为整个序列)中选择其中最大的元素max ,然后将该元素同未排序序列中的最后一个元素交换。

这时,max 元素就包含在由每次的最大元素组成的已排序序列之中了,也就说这时的max 已经不在未排序序列之中了。

重复上述过程直到完成整个序列的排序。

(a) 写出Maxsort 算法。

其中待排序序列为E ,含有n 个元素,脚标为范围为0,,1n -。

void Maxsort(Element[] E) { int maxID = 0;for (int i=E.length; i>1; i--) { for (int j=0; j<i; j++) {if (E[j] > E[maxID]) maxID = k; }E[i] <--> E[maxID]; } }最坏情况同平均情况是相同的都是11(1)()2n i n n C n i -=-==∑。

几遍浏览序列实现。

排序策略是顺序比较相邻元素,如果这两个元素未排序则交换这两个元素的位置。

也就说,首先比较第一个元素和第二个元素,如果第一个元素大于第二个元素,这交换这两个元素的位置;然后比较第二个元素与第三个元素,按照需要交换两个元素的位起泡排序的最坏情况为逆序输入,比较次数为11(1)()2n i n n C n i -=-==∑。

(b) 最好情况为已排序,需要(n-1)次比较。

4.3: (a)归纳法:当n=1时显然成立,当n=2时经过一次起泡后,也显然最大元素位于末尾;现假设当n=k-1是,命题也成立,则当n=k 时,对前k-1个元素经过一次起泡后,根据假设显然第k-1个元素是前k-1个元素中最大的,现在根据起泡定义它要同第k 个元素进行比较,当k元素大于k-1元素时,它为k个元素中最大的,命题成立;当k元素小于k-1元素时,它要同k-1交换,这时处于队列末尾的显然时队列中最大的元素。

算法设计与分析-习题参考答案

算法设计与分析-习题参考答案

算法设计与分析基础习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d一定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。

数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。

故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—山羊C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表‖60,35,81,98,14,47‖排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表‖60,35,81,98,14,47‖排序的过程如下所示:b.该算法不稳定.比如对列表‖2,2*‖排序c.该算法不在位.额外空间for S and Count[] 4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n)b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty. (―lazy deletion ‖)第2章 习题2.17.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。

算法设计与分析第三版第四章课后习题答案

算法设计与分析第三版第四章课后习题答案

算法设计与分析第三版第四章课后习题答案4.1 线性时间选择问题习题4.1问题描述:给定一个长度为n的无序数组A和一个整数k,设计一个算法,找出数组A中第k小的元素。

算法思路:本题可以使用快速选择算法来解决。

快速选择算法是基于快速排序算法的思想,通过递归地划分数组来找到第k小的元素。

具体步骤如下: 1. 选择数组A的一个随机元素x作为枢纽元。

2. 使用x将数组划分为两个子数组A1和A2,其中A1中的元素小于等于x,A2中的元素大于x。

3. 如果k等于A1的长度,那么x就是第k小的元素,返回x。

4. 如果k小于A1的长度,那么第k小的元素在A1中,递归地在A1中寻找第k小的元素。

5. 如果k大于A1的长度,那么第k小的元素在A2中,递归地在A2中寻找第k-A1的长度小的元素。

6. 递归地重复上述步骤,直到找到第k小的元素。

算法实现:public class LinearTimeSelection {public static int select(int[] A, int k) { return selectHelper(A, 0, A.length - 1, k);}private static int selectHelper(int[] A, int left, int right, int k) {if (left == right) {return A[left];}int pivotIndex = partition(A, left, righ t);int length = pivotIndex - left + 1;if (k == length) {return A[pivotIndex];} else if (k < length) {return selectHelper(A, left, pivotInd ex - 1, k);} else {return selectHelper(A, pivotIndex + 1, right, k - length);}}private static int partition(int[] A, int lef t, int right) {int pivotIndex = left + (right - left) / 2;int pivotValue = A[pivotIndex];int i = left;int j = right;while (i <= j) {while (A[i] < pivotValue) {i++;}while (A[j] > pivotValue) {j--;}if (i <= j) {swap(A, i, j);i++;j--;}}return i - 1;}private static void swap(int[] A, int i, int j) {int temp = A[i];A[i] = A[j];A[j] = temp;}}算法分析:快速选择算法的平均复杂度为O(n),最坏情况下的复杂度为O(n^2)。

算法设计与分析课后部分习题答案

算法设计与分析课后部分习题答案

算法实现题3-7 数字三角形问题问题描述:给定一个由n行数字组成的数字三角形,如图所示。

试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

编程任务:对于给定的由n行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。

数据输入:有文件input.txt提供输入数据。

文件的第1行是数字三角形的行数n,1<=n<=100。

接下来的n行是数字三角形各行的数字。

所有数字在0-99之间。

结果输出:程序运行结束时,将计算结果输出到文件output.txt中。

文件第1行中的数是计算出的最大值。

输入文件示例输出文件示例 input.txt output.txt 5 30 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5源程序:#include "stdio.h" voidmain(){ intn,triangle[100][100],i,j;//triangle数组用来存储金字塔数值,n表示行数 FILE *in,*out;//定义in,out两个文件指针变量in=fopen("input.txt","r");fscanf(in,"%d",&n);//将行数n读入到变量n中for(i=0;i<n;i++)//将各行数值读入到数组triangle中for(j=0;j<=i;j++)fscanf(in,"%d",&triangle[i][j]);for(int row=n-2;row>=0;row--)//从上往下递归计算for(int col=0;col<=row;col++)if(triangle[row+1][col]>triangle[row+1][col+1])triangle[row][col]+=triangle[row+1][col];elsetriangle[row][col]+=triangle[row+1][col+1];out=fopen("output.txt","w");fprintf(out,"%d",triangle[0][0]);//将最终结果输出到output.txt中 }算法实现题4-9 汽车加油问题问题描述:一辆汽车加满油后可行驶nkm。

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

第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。

若f=Ο(g),则必然存在常数c1>0和n0,使得∀n≥n0,有f≤c1*g(n)。

由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。

必要性。

同理,若g=Ω(f),则必然存在c2>0和n0,使得∀n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。

2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得∀n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。

由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。

3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。

证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得∀n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。

4)log(n!)= Θ(nlogn)证明:∙由于log(n!)=∑=n i i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。

∙由于对所有的偶数n 有,log(n!)= ∑=n i i 1log ≥∑=n n i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。

当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得∀n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。

综合以上两点可得log(n!)= Θ(nlogn)2. 设计一个算法,求给定n 个元素的第二大元素,并给出算法在最坏情况下使用的比较次数。

(复杂度至多为2n-3)算法:V oid findsecond(ElemType A[]){for (i=2; i<=n;i++)if (A[1]<A[i]){temp=A[1];A[1]=A[i];A[i]=temp;}for (i=3; i<=n;i++)if (A[2]<A[i]){temp=A[1];A[1]=A[i];A[i]=temp;}return A[2];}该算法使用的比较次数为:2n-33.设计一个算法,求给定n个元素的最大和最小元素。

(要求算法的复杂度至多为1.5n)算法:void Maxmin2(A;l,r;int x;int y);{if (l=r) { x=A[l]; y=A[r]; return;}if (r-l=1){ if (A[l]<A[r]) { x=A[l]; y=A[r];}else { x=A[r]; y=A[l];}return;}else { mid:=(l+r) div 2;Maxmin2(A,l,mid,x1,y1);Maxmin2(A,mid+1,r,x2,y2);x=min(x1,x2); y=max(y1,y2); }}该算法使用的比较次数为:1.5n-24.给定多项式p(x)=a n x n+ a n-1x n-1+…+a1x+a0,假设使用以下方法求解:p=a0;xpower=1;for (i=1; i<=n; i++){ xpower=x * xpower;p=p+a i * xpower;}求(1)该算法最坏情况下使用的加法和乘法分别为多少次?(2)能不能对算法的性能进行提高?解:(1)该算法最坏情况下使用的加法n次,乘法2n次(2)改进的算法为:float Horner(A, float x){p=A[n+1];for (j=1; j<=n; j++)p=x*p+A[n-j];return p;}该算法中使用加法n次,乘法n次第二章1.求解下列递推关系:1)当n≥1时,f(n)=3f(n-1);f(0)=5解:f(n)=3f(n-1)=32f(n-2)=…=3n f(n-n)= 3n *5=5*3n2) 当n≥2时,f(n)=5f(n-1)-6f(n-2);f(0)=1;f(1)=0解:该递推关系的特征方程为:x2-5x+6=0特征根为:r1=2;r2=3故f(n)=c1*2n+c2*3n有f(0)= c1*20+c2*30== c1+c2=1 且f(1)= c1*21+c2*31== 2c1+c32=0 可得c1 =3,c2=-2故f(n)=3*2n-2*3n3) 当n≥1时,f(n)=f(n-1)+n2;f(0)=0解:f(n)= f(n-1)+n2= f(n-2)+ (n-1)2+n2=….= f(0)+12+22+…+ (n-1)2+n2=12+22+…+ (n-1)2+n2=1/6 n(n+1)(2n+1)4) 当n≥1时,f(n)=2f(n-1)+n2;f(0)=1解:设f(n)=2n f’(n),且f’(0)= f(0)=1则2n f’(n)=2*(2n-1f’(n -1))+ n 2即f’(n)= f’(n -1)+n n 22 = f’(0)+∑=n i i i 122 =1+∑=n i ii 122所以f(n)= 2n *(1+∑=n i ii 122)=2n *(10-n n 26+)=10*2n -(n+6) 5) 当n ≥1时,f(n)=nf(n-1)+1; f(0)=1解:f(n)=n!*( f’(0)+ ∑=ni i 1!1) = n!*( 1+ ∑=ni i 1!1)2.求解下面的递推式:当n ≥2时,f(n)=4f(n/2)+n ; f(1)=1。

假设n 为2的幂,用直接展开法求解递推式。

解:令k n 2=f(n)=4f(n/2)+n=n n n f ++)2)2(4(*42 =n n n f ++2)2(422 =n n n n f +++22)2(4233 =….=n n n n f k k k ++++-22)2(41 =n f k k )122()1(41++++-=n n k )12(2-+=n n -223.求解下面的递推式:当n ≥2时,f(n)=9f(n/3)+n 2; f(1)=1。

假设n 为3的幂,用直接展开法求解递推式。

解:令k n 3= f(n) =2)3(9n nf +=222))3()3(9(9n n n f ++=2222)3(9n n n f ++=22233)3(9n n n nf +++=….=2)3(9kn nf k k +=n n n 322log +4. 法求解递推式的上界:当n ≥4时,n n f n f n f +⎥⎦⎥⎢⎣⎢+⎥⎦⎥⎢⎣⎢=)43()4()(;当n<4时,f(n)=4。

解: 由于递推式为44)43()4(4)(≥<⎪⎩⎪⎨⎧+⎥⎦⎥⎢⎣⎢+⎥⎦⎥⎢⎣⎢=n n n n f n f n f 这里14341=+ 故作猜想n nf n f +=)2(2)(的解为:n n n n f 4log )(+=故对原递推式做猜想n n cn n f 4log )(+≤ 由于n n f n f n f +⎥⎦⎥⎢⎣⎢+⎥⎦⎥⎢⎣⎢=)43()4()(n n n n c n n n c +⎥⎦⎥⎢⎣⎢+⎥⎦⎥⎢⎣⎢⎥⎦⎥⎢⎣⎢+⎥⎦⎥⎢⎣⎢+⎥⎦⎥⎢⎣⎢⎥⎦⎥⎢⎣⎢≤43443log 43444log 4n nn n c n n n c ++++≤43443log 43444log 4=n n cn n cn 5)43log (log 43)4log (log 41+++-n cn n cn 5)3log 432(log +--=若使f(n)满足上界为n n cn 4log +则必有n n cn n cn n cn 4log 5)3log 432(log +≤+-- 即0)3log 432(≤+--n cn 所以23.13log 4321=-≥c故n n n n f 4log 23.1)(+≤,即上界为n n n 4log 23.1+4. 设计算法,求解问题:有一楼梯共M 级,刚开始时你再第一级,若每次只能跨上一级或二级,要走上第M 级,共有多少种走法?int fa(int m){int z;if (m==1) z=1;else if (m==2) z=2;、else z=fa(n-1)+fa(n-2);return z;}5.设计算法,一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种?这道题的思路与字符串的组合很像,用递归解决。

一次射击有11种可能,命中1环至10环,或脱靶。

函数功能:求解number次打中sum环的种数函数参数: number为打靶次数,sum为需要命中的环数,result用来保存中间结果,total记录种数void ShootProblem_Solution(int number, int sum, vector<int> &result, int &total){I if(sum < 0 || number * 10 < sum)//加number * 10 < sum非常重要,它可以减少大量的递归,类似剪枝操作return;if(number == 1) //最后一枪{if(sum <= 10) //如果剩余环数小于10,只要最后一枪打sum环就可以了{for(unsigned i = 0; i < result.size(); i++)cout<<result[i]<<' ';cout<<sum<<endl;total++;return;}elsereturn;}for(unsigned i = 0; i <= 10; i++) //命中0-10环{result.push_back(i);ShootProblem_Solution(number-1, sum-i, result, total); //针对剩余环数递归求解result.pop_back();}}void ShootProblem(int number, int sum){int total = 0;vector<int> result;ShootProblem_Solution(number, sum, result, total);cout<<"total nums = "<<total<<endl;}int main(){ShootProblem(10, 90);return 0;}6.设计算法,求解猴子吃桃问题:有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,依此类推),第九天正好吃完,问猴子们摘来了多少桃子?思路:可假设有第十天,则第十天剩余的桃子数目为0,由此递推可得每一天剩余的桃子数目。

相关文档
最新文档