アルゴリズム・イントロダクション第2章第1節の練習問題
2.1-2
def insertion_sort(A): 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 -= 1 A[i+1] = key
2.1-3
def linear_search(A, v): for i in range(len(A)): if A[i] == v: return i return None
ループ不変式
第2-4行のforループが開始されるとき、部分配列 A[0 .. i-1] に目的の値 v は存在しない。
初期条件
はじめ、 i = 0 からループが開始される。このときに不変式が成り立つことを示す。 i = 0 のとき、部分配列 A[0 .. i-1] は要素をひとつも持たない。要素をひとつも持たないから、明らかに目的の値 v は存在しない。
ループ内条件
いま、 A[0 .. i-1] に目的の値 v は存在していないとする。もし、 A[i] が v ならば、このアルゴリズムは i を出力して終了するから次のループは実行されない。もし、A[i] が v でないならば、次のループが実行される。このとき、A[0 .. i-1] に v が存在せず、 A[i] も v ではないから、 A[0 .. i] に v は存在しない。よってループ不変式は維持される。
終了条件
ループが終了するとき、 i = len(A) である。このとき、ループ不変式にこのiを代入すると、部分配列 A[0 .. len(A)-1] に目的の値 v は存在しないことが分かる。ところが、部分配列 A[0 .. len(A)-1] は A そのものであるから、 A に目的の値 v が存在しなかったということが言える。
2.1-4
入力:長さnの数列 A = {a1, a2, ..., an} と B = {b1, b2, ..., bn}。ただし ai, bi (1 <= i <= n) は 0 または 1。
出力:A, Bをそれぞれn桁の2進数と見なしたとき、その和を2進数の形式で格納した長さ n+1 の数列 C。
def add(A, B): n = len(A) C = [0] * (n+1) carry = 0 for i in range(n): s = A[i] + B[i] + carry if s >= 2: s -= 2 carry = 1 else: carry = 0 C[i] = s C[n] = carry return C