CLRS の第 3 版の問題 2-4 に関連する python コードを実装したいと考えています。問題は、41 ページの「リスト内のInversionの数を見つける」で、次のコードを記述します。
mainCounter = 0
def merg(array,counter):
if len(array)==1:
return array
left = array[:len(array)/2]
right = array[len(array)/2:]
return combine(merg(left, counter), merg(right, counter), counter)
def combine(array1, array2, counter):
global mainCounter
result = []
pointer1 = 0
pointer2 = 0
while(pointer1 != len(array1) and pointer2 != len(array2)):
if array1[pointer1] < array2[pointer2]:
result.append(array1[pointer1])
pointer1 += 1
elif array1[pointer1] == array2[pointer2]:
result.append(array1[pointer1])
pointer1 += 1
else:
result.append(array2[pointer2])
counter += (len(array1)-pointer1)
pointer2 += 1
if pointer1 == len(array1):
for i in array2[pointer2:]:
result.append(i)
else:
for i in array1[pointer1:]:
result.append(i)
mainCounter+=counter
return result
問題は、このモジュールを python コンソールにインポートすると、mainCounter は変更されませんが、これは変更する必要があることです !!:
Python 2.7.3 (default, Aug 1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mergSort import *
>>> merg([1,4,2,3],0)
0
0
2
[1, 2, 3, 4]
>>> merg([1,4,2,3],0)
2
2
4
[1, 2, 3, 4]
>>> mainCounter
0
>>> merg([1,4,2,3],0)
4
4
6
[1, 2, 3, 4]
>>> merg([1,4,2,3],0)
6
6
8
[1, 2, 3, 4]
>>> merg([1,4,2,3],0)
8
8
10
[1, 2, 3, 4]
>>> mainCounter
0
関数を呼び出すたびmerg
に異なる結果が得られますが、mainCounter は変更されません! どこが間違っていますか?