わかりました、最初からやり直しましょう。ここで行うことは次のとおりです。
def interleave(string):
i = (len(string)/2) - 1
j = i+1
while(i > 0):
k = i
while(k < j):
tmp = string[k]
string[k] = string[k+1]
string[k+1] = tmp
k+=2 #increment by 2 since were swapping every OTHER character
i-=1 #move lower bound by one
j+=1 #move upper bound by one
これは、プログラムが実行しようとしているものの例です。変数i
、j
、を使用しますk
。i
そしてj
はそれぞれ下限と上限k
になり、 は交換するインデックスになります。
例
`abcd1234`
i = 3 //got this from (length(string)/2) -1
j = 4 //this is really i+1 to begin with
k = 3 //k always starts off reset to whatever i is
swap d and 1
increment k by 2 (k = 3 + 2 = 5), since k > j we stop swapping
result `abc1d234` after the first swap
i = 3 - 1 //decrement i
j = 4 + 1 //increment j
k= 2 //reset k to i
swap c and 1, increment k (k = 2 + 2 = 4), we can swap again since k < j
swap d and 2, increment k (k = 4 + 2 = 6), k > j so we stop
//notice at EACH SWAP, the swap is occurring at index `k` and `k+1`
result `ab1c2d34`
i = 2 - 1
j = 5 + 1
k = 1
swap b and 1, increment k (k = 1 + 2 = 3), k < j so continue
swap c and 2, increment k (k = 3 + 2 = 5), k < j so continue
swap d and 3, increment k (k = 5 + 2 = 7), k > j so were done
result `a1b2c3d4`
プログラムの正しさの証明については、このリンクを参照してください。ループ不変条件を使用して、これが正しいことを証明する方法を説明します。
大まかな証明は次のようになります。
i
初期化: ループの最初の反復の前に、が に設定されて
いることがわかります(length(string)/2) - 1
。ループに入る前に、 i <= length(string) であることがわかります。
- メンテナンス。各反復の後、
i
はデクリメントされ ( i = i-1, i=i-2,...
)、その時点で が存在する必要がありますi<length(string)
。
- 終了:
i
は正の整数の減少するシーケンスであるため、ループの不変式i > 0
は最終的に false と等しくなり、ループは終了します。