第二章课后题答案

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

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]<key:
        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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值