Это необходимо, потому что на следующей итерации функция снова будет append
элементом, поэтому, если вы не сделали pop
заранее, список будет увеличиваться в размере. Поскольку backtrack
добавляет результаты только в том случае, если длина temp
равна длине исходного arr
, ничего не будет добавлено после первой перестановки [1, 2, 3]
(поскольку с этого момента список temp
продолжает расти) .
Мы можем просто удалить эту строку (temp.pop()
) и посмотреть, как будут выглядеть результаты:
[[1, 2, 3]]
Теперь, если мы также изменим, результаты добавляются всякий раз, когда len(temp) >= len(arr)
, тогда мы Вы увидите, как temp
увеличивается в размере:
[[1, 2, 3], [1, 2, 3, 3], [1, 2, 3, 3, 2], [1, 2, 3, 3, 2, 3]]
Здесь мы получаем меньше результатов, потому что для каждого рекурсивного вызова за пределами [1, 2, 3]
список temp
немедленно копируется, даже не достигая for
l. oop.