个人做的课后练习
书籍:算法设计与分析基础(第三版)
习题2.4
一.
a. 5*n-5
b. 4*pow(3,n-1)
c. n*(n+1)/2
d. 2*n-1
e. log3(n)+1
二.
n!的阶乘
F(n)=n*F(n-1),其中F(0)=1;
递归的次数是:n次
三.
a.加法:A(n)=A(n-1)+1,其中A(1)=0;
解得 A(n)=n-1
乘法:M(n)=M(n-1)+2,其中M(1)=0;
解得 M(n)=2*(n-1)
b.运用递归和运用循环计算这个问题。其做的加法和乘法次数都是一样的。个人偏向使用循环,递归算法占用的内存比较大。
四.
a.该算法计算的是 n的平方
b.乘法:M(n)=M(n-1)+1,其中M(1)=0;
解得 M(n)=n-1
c.加减法:A(n)=A(n-1)+2,其中A(1)=0;
解得 A(n)=2*(n-1)
五.
a.( pow(2,64)-1)/(365*24*60)
b. pow(2,i-1)+1
c. 直接用递推公式 M(n)=M(n-1)+1+M(n-1),从第一项开始计算。
Hanoi(n)
M[0]←0
for i←1 to n do
M[i]←M[i-1]+1+M[i-1]
return M[n]
六.
因为每一次都需要从B进行操作。我们可以假设把n个圆盘从A移到C中。假设把盘子移到相邻柱子所用步数为M(n);
首先,我们把A中的n-1个盘移动到B,然后,再把B中的n-1个圆盘移动到C,然后这时候把A中剩下的一个圆盘移动到B,再把C中的n-1个圆盘移动到B,然后再从B把n-1个圆盘移动到A,把B中剩下的一个圆盘移动到C,再把A中的n-1个圆盘移动到B,再移动到C,就完成了本次的操作了。
从上述中,我们可以得出一个公式:
2*M(n)=M(n-1)+M(n-1)+1+M(n-1)+M(n-1)+1+M(n-1)+M(n-1)=6*M(n-1)+2,其中M(1)=1;
解得有:2*M(n)=pow(3,n)-1
七.
a.可以直接用数学归纳法证明
b.递推关系有:M(n)=M(n/2)+1,其中M(0)=0;
八.
a.
value(n)
if n==0
return 1;
else
return value(n-1)+value(n-1);
b. A(n)=A(n-1)+1+A(n-1),其中A(0)=0;
解得 A(n)=pow(2,n)-1;
c. 这里就不作图了…
d.不是一个好的算法,因为这是一个指数规模的算法。
九.
a. 找到数组里面最小的元素
b. 基本的操作是:比较
J(n)=J(n-1)+1;J(1)=0;
解得 J(n)=n-1
十.
O(n*n)
十一.
a. 显然可以得到递推关系有:
M(n)=n*M(n-1),其中M(2)=2,M(1)=0;
解得 M(n)=n!
b. 如果依然按照这个思路,利用循环,从二阶矩阵开始算起的话。
计算二阶矩阵: n(n-1)/2
计算三阶矩阵: n(n-1)(n-2)/2
…
计算n阶矩阵:n!/2
如果使用n的排列计算行列式:
算法就是 n的全排序,也就是n!
十二.
M(n)=M(n-1)+4*n,其中M(0)=1;
解得 M(n)=2(n+1)n
十三.
a.
time(n)
if n==1 or n==2
return 2;
else
return time(n-2)+time(2);
时间的关系:n/2向上取整*2
b.显然时间不是最少的,因为烤三个面包所需的时间是3分钟。
c.
time(n)
if n==3
return 3;
else if n==1 or n==2
return 2;
else
return time(n-3)+time(3);
十四. 名人问题
从题目中,我们可以知道,所有人都认识名人,而名人不认识其他人。假如,A认识B,那么,证明了A不是名人;若,A不认识B,那么证明了B不是名人。所以,每判断一次,就可以排除一个,我们只需要n-1次,就可以筛选出最后那一个可能是名人的人。最后,我们只需要检验他到底认不认识其他人,和,其他人是否都认识他,判断有无名人。显然,这里需要2*(n-1)次,总体算法的复杂度是 O(n)