これは、(リスト) が変更可能であることを意味する Python コードであるため、元に戻すためs
、呼び出された関数で変更が加えられた場合、呼び出し元の配列に影響します。
スワップバックしなかった場合、呼び出しが戻った後、配列は「奇妙な」状態になります (以前の呼び出しによって残されます)。
突然変異を必要としない代替案は次のとおりです。
s = [1,2,3,4,5,6,7,8,9]
def perm(s, i):
s = list(s) # copy before mutating
if i == len(s):
print s
for j in range(i, len(s)):
s[i], s[j] = s[j], s[i]
perm(s, i + 1)
または、おそらくより明確に:
s = [1,2,3,4,5,6,7,8,9]
デフォルトパーマ(s、i):
i == len(s) の場合:
プリント
範囲内の j の場合 (i, len(s)):
s[i]、s[j] = s[j]、s[i]
perm(list(s), i + 1) # コピーを渡す
これが反対票を投じられた理由がわからないコメント。ユーザーは同時に質問にいくつかのコメントをしましたが、その後それらを削除しました。私は彼らが間違っていたと思います、そしてコメントを削除することは彼らがそれを認識したことを意味すると思いますが、なぜ彼らが反対票も削除しなかったのかわかりません(それが彼らのものである場合)。または、これが間違っている場合は、誰かが説明してください。私が学ぶことができます...