第二章课后题答案

一下答案为本人总结,如有错误或更好的解法,欢迎指出!

2-1-1:

根据图2-2,叙述题目中数组A=<31,41,59,26,41,58>的执行过程。

循环开始前,将数组A的第一个元素固定,由于仅包含一个元素,说明A[0]这个序列是已经排好序的序列;循环开始,每次循环时,A[1]设定为key值,与A[1]左边的序列依次进行对比分析,如果key值小于右边序列的值,调换位置,A中,41>31,不用调换,循环这一过程,直到数组循环完毕。

具体流程如下:

31 41 59 26 41 58

31 41 59 26 41 58

31 41 26 59 41 58

31 26 41 59 41 58

26 31 41 59 41 58

26 31 41 41 59 58

26 31 41 41 58 59


2-1-2:


a=[5,2,4,6,1,3]

for j in range(1,len(a)):
    key=a[j]
    i=j-1
    while i>=0 and a[i]1]=a[i]
        i=i-1
    a[i+1]=key

print(a)


2-1-3:

伪代码:

Linear_Find(A,v):

    n=len(A)

    for i in range(n):

        if v==A[i]:

            return i

    return NIL

循环不变性的描述证明:

    初始化:在循环迭代之前,正确---因为数组没有进行任何操作,也没有返回任何数值

    保持:在第K次循环的情况下,存在两种可能的情况,匹配到V,返回该元素所在下标;未匹配到V,继续进行下一步的循环,操作正确

    终止:循环终止时,存在两种情况,匹配到V,返回该元素所在下标;未匹配到V,返回值NIL,算法正确


2-1-4

形式化描述:依次对两个二进制的每一位进行加操作,C[i+1]=A[i]+B[i]+flags,如果C[i+1]为零,那么相应的加和后的新二进制数的相应位也为零,同时设定flag=0;如果C[i+1]为1,相应位的二进制位也为1,flag=1;如果C[i+1]等于2的情况下,相应位的二进制位为0,flag=1;如果C[i+1]等于3的情况下,相应的二进制位为1,flag=1

伪代码:

ADD_B(A,B):

    n=len(A)

    C=[0 for i in range(n+1)]

    flag=0

    for i in range(len(A)-1,-1,-1):

        c=A[i]+B[i]+flag

        if c==0:

            C[i+1]=0

            flag=0

        elif c==1:

            C[i+1]=1

            flag=0

        elif c==2:

            C[i+1]=0

            flag=1

        elif c==3:

            C[i+1]=1

            flag=1

C[0]=flag




你可能感兴趣的:(算法导论(第三版),答案解析)