он обменивает назад, потому что это питон код, который означает, что 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]
def perm(s, i):
if i == len(s):
print s
for j in range(i, len(s)):
s[i], s[j] = s[j], s[i]
perm(list(s), i + 1) # pass a copy
комментария уверен, почему это было downvoted. пользователь сделал несколько комментариев по этому вопросу одновременно, но затем удалил их. я думаю, что они ошибались, и я думаю, что удаление комментариев означает, что они это поняли, но я не понимаю, почему они также не удалили нисходящее (если это было их). альтернативно, если это неправильно, пожалуйста, объясните кому-нибудь, чтобы я мог узнать ...
@Jason вызов возвращается в какой-то момент. –
@ Джейсон возвращается обратно после возврата рекурсивного вызова. –
@Jason рекурсивные вызовы также отменяют самих себя, используя ту же линию обратной подкачки. –