そのため、Python でブロック スワップ アルゴリズムを実装しています。
私がフォローしているアルゴリズムは次のとおりです。
A = arr[0..d-1] および B = arr[d..n-1] を初期化します。 1) A のサイズが B のサイズと等しくなるまで、以下を実行します。
a) A が短い場合、Br が A と同じ長さになるように、B を Bl と Br に分割します。A と Br を入れ替えて、ABlBr を BrBlA に変更します。A は最終的な場所にあるので、B の部分を繰り返します。
b) A が長い場合、Al が B と同じ長さになるように A を Al と Ar に分割し、Al と B を交換して、AlArB を BArAl に変更します。これで B は最終的な場所にあるので、A の部分を繰り返します。
2) 最後に、A と B が同じサイズになったら、それらをブロック交換します。
同じアルゴリズムがこの Web サイトの C で実装されています - Array Rotation
同じための私のpythonコードは
a = [1,2,3,4,5,6,7,8]
x = 2
n = len(a)
def rotate(a,x):
n = len(a)
if x == 0 or x == n:
return a
if x == n -x:
print(a)
for i in range(x):
a[i], a[(i-x+n) % n] = a[(i-x+n) % n], a[i]
print(a)
return a
if x < n-x:
print(a)
for i in range(x):
a[i], a[(i-x+n) % n] = a[(i-x+n) % n], a[i]
print(a)
rotate(a[:n-x],x)
else:
print(a)
for i in range(n-x):
a[i], a[(i-(n-x) + n) % n] = a[(i-(n-x) + n) % n] , a[i]
print(a)
rotate(a[n-x:], n-x)
rotate(a,x)
print(a)
各段階で正しい値を取得していますが、再帰関数呼び出しが期待される結果を返さず、原因を理解できないようです。誰かが私の再帰の何が悪いのか説明できますか? そして可能な代替案は何ですか。