作业一
学号:_____ 姓名:_____
说明:
1、正文用宋体小四号,1.5倍行距。
2、报告中的图片、表格中的文字均用宋体五号,单倍行距。
3、图片、表格均需要有图片编号和标题,均用宋体五号加粗。
4、参考文献用宋体、五号、单倍行距,请参照参考文献格式国家标准(GB/T 7714-
2005)。
5、公式请使用公式编辑器。
P14
4.用伪代码写一个算法来求方程ax2+bx+c=0的实根,a,b,c 是任意实系数。
(可以假设sqrt(x)是求平方根的函数。
)
算法:Equate(a,b,c)
//实现二元一次方程求解实数根
//输入:任意系数a,b,c
//输出:方程的实数根x1,x2或无解
If a≠0
p←b2−4ac
If p>0
x1←−b+sqrt(p)
2a
x2←−b−sqrt(p)
2a
return x1,x2
else if p=0
return −b
2a
else
return “no real roots”
else
if b≠0
return −c
b
else
if c≠0
return “no real numbers”
else
return “no real roots”
5.写出将十进制正整数转换为二进制整数的标准算法。
a.用文字描述。
b.用伪代码描述。
a.解:
输入:一个正整数n
输出:正整数n相应的二进制数
第一步:用n 除以2,余数赋给K[i](i=0,1,2...),商赋给n
第二步:如果n=0 ,则到第三步,否则重复第一步
第三步:将K[i]按照i从高到低的顺序输出
b.解:
算法:DecToBin(n)
//实现正整数十进制转二进制
//输入:一个正整数n
//输出:正整数n对应的二进制数组K[0..i]
i ←1
while n≠0 do
K[i]←n%2
n←(int)n/2
i ++
while i≠0do
print K[i]
i - -
p46
2.请用O,Ω 和θ的非正式定义来判断下列断言是真还是假。
a. n(n+1)/2∈O(n3)
b. n(n+1)/2∈O(n2)
c. n(n+1)/2∈θ(n3)
d. n(n+1)/2∈Ω(n)
解:
断言为真:a,b,d
断言为假:c
P53
5.考虑下面的算法。
算法:Secret(A[0..n−1])
//输入:包含n个实数的数组A[0..n−1]
minval←A[0];maxval←A[0]
for i←1 to n−1 do
if A[i]<minval
minval←A[i]
if A[i]>maxval
maxval←A[i]
return maxval−minval
a. 该算法求的是什么?
b. 它的基本操作是什么?
c. 该基本操作执行了多少次?
d. 该算法的效率类型是什么?
e. 对该算法进行改进,或者设计一个更好的算法,然后指出它的效率类型。
如
果做不到这一点,请试着证明这是不可能做到的。
a.答:该算法求的是一组数中最大值与最小值的差值。
b.答:A[i]<minval和minval←A[i]和A[i]>maxval和maxval←
A[i]
c.答:n−1次
d.答:O(n)
e.由于此为一维数组若要得到其最大或最小值,者至少需比较n−1次,因
此效率类型为O(n),无法改进。
6.考虑下面的算法。
算法:Enigma(A[0..n−1,0..n−1])
//输入:一个实数矩阵A[0..n−1,0..n−1]
for i←0 to n−2 do
for j←i+1 to n−1 do
if A[i,j]≠A[j,i]
return false
return true
a. 该算法求的是什么?
b. 它的基本操作是什么?
c. 该基本操作执行了多少次?
d. 该算法的效率类型是什么?
e. 对该算法进行改进,或者设计一个更好的算法,然后指出它的效率类型。
如
果做不到这一点,请试着证明这是不可能做到的。
a.答:该算法求的是二维数组是否对称。
b.答:A[i,j]≠A[j,i]
c.答:n2/2次
d.答:O(n2)
e.答:若判断一个矩阵是否为对称矩阵,则至少需比较矩阵一半数量次数,
所以无法改进。
P59-60
1.解下列递推关系。
a. x(n)=x(n−1)+5 ,其中n>1 ,x(1)=0
b. x(n)=3x(n−1) ,其中n>1 ,x(1)=4
c. x(n)=x(n−1)+n ,其中n>0 ,x(0)=0
)+n ,其中n>1 ,x(1)=1(对于n=2k的情况求解)
d. x(n)=x(n
2
e. x(n)=x(n
)+1 ,其中n>1 ,x(1)=1(对于n=3k的情况求解)
3
a.解:x(n)=x(n−1)+5 ,for n>1 ,x(1)=0
x(n)=[x(n−2)+5]+5=x(n−2)+5×2
x(n)=[x(n−3)+5]+5×2=x(n−3)+5×3
x(n)=[x(n−4)+5]+5×3=x(n−4)+5×4
…
x(n)=x(n−i)+5×i
…
x(n)=x(1)+5×(n−1)=5×(n−1)
b.解:x(n)=3x(n−1) ,for n>1 ,x(1)=4
x(n)=3×3x(n−2)=32x(n−2)
x(n)=3×32x(n−3)=33x(n−3)
x(n)=3×33x(n−4)=34x(n−4)
…
x(n)=3i x(n−i)
…
x(n)=3n−1x(1)=4×3n−1
c.解:x(n)=x(n−1)+n ,for n>0 ,x(0)=0
x(n)=[x(n−2)+n−1]+n=x(n−2)+n−1+n
x (n )=[x (n −3)+n −2]+n −1+n =x (n −3)+3n −3 x (n )=[x (n −4)+n −3]+3n −3=x (n −4)+4n −6 …
x (n )=x (n −i )+i ×n −i ×i−12
…
x (n )=x (0)+n 2
−n ×
n−12
=
n 22
+n
2
d. 解:x(n)=x(n/2)+n ,for n >1 ,x(1)=1 (对于n =2k 的情况求解) x (n )=[x (n
4)+n
2]+n =x (n
4)+n
2+n x (n )=[x (n
8)+n
4]+n
2+n =x (n
8)+n
4+n
2+n
x (n )=[x (n
16)+n
8]+n
4+n
2+n =x (n
16)+n
8+n
4+n
2+n …
x(n)=x(n
2i )+2n(1−1
2i ) …
x (n )=x (1)+2n −2=2n −1
e. 解:x(n)=x(n/3)+1 ,for n >1 ,x(1)=1 (对于n =3k 的情况求解) x (n )=[x (n
9)+1]+1=x (n
9)+2 x (n )=[x (n
27)+1]+2=x (n
27)+3 x (n )=[x (n
81)+1]+3=x (n
81)+4 …
x(n)=x(n 3i )+i …
x (n )=x (1)+log 3n =log 3n +1
3.考虑下列递归算法,该算法用来计算前n 个立方的和:S(n)=13+23+⋯+n 3 算法:S(n)
//输入:正整数n
//输出:前n个立方的和
if n=1return 1
else return S(n−1)+n∗n∗n
a. 建立该算法的基本操作执行次数的递推关系并求解。
b. 如果将这个算法和直截了当的非递归算法比较,你做何评价?
a.答:执行n次,S(n)=S(n−1)+n∗n∗n=S(n−2)+(n−1)3+
n3=⋯=S(1)+23+33+⋯+(n−1)3+n3
b.太麻烦
4.考虑下面的递归算法。
算法:Q(n)
//输入:正整数n
if n=1return 1
else return Q(n−1)+2n−1
a. 建立该函数的递推关系并求解,以确定该算法计算的是什么?
b. 建立该算法所做的乘法运算次数的递推关系并求解。
c. 建立该算法所做的加减运算次数的递推关系并求解。
a.Q(n)=Q(n−1)+2n−1=Q(n−2)+2(n−1)−1+2n−1=Q(n−
3)+2(n−2)−1+2(n−1)−1+2n−1=⋯=n2计算的是n2
b.答:n−1次,当n=1时返回1,当n>1时返回n2,Q(n)=Q(n−1)+2n 。
c.答:3n−3次。