О, вы делаете вещи очень тяжело для себя ...
Внутри dfs
вы звоните dfs
вот так:
dfs(nums, visited, tmp, result)
Тогда, в этом вторая итерация, вы добавляете tmp
к result
следующим образом:
result.append(tmp)
Затем, как только вы вернетесь, вы удаляете 1
из tmp
с этим:
tmp.pop()
Это удаляет его из tmp
, но поскольку вы добавили список tmp
в result
, теперь вы изменили result
с [[1]]
на [[]]
- там tmp
в конце концов.
Вы должны пересмотреть то, что нужно именно здесь. И в Python передача переменных по ссылке, как вы делаете, и изменение их содержимого - не очень хороший подход. Попробуйте подумать об этом функционально, не полагаясь на побочные эффекты.
Если ответ, который я дал, звучит сложно, то это потому, что вы создали довольно сложное решение для действительно простой проблемы в Python. Например, вот более простое решение:
def permutations(xs):
if len(xs) < 2:
yield xs
else:
for n in range(len(xs)):
for continuation in permutations(xs[:n] + xs[n+1:]):
yield [xs[n]] + continuation
print(list(permutations([1,2,3,4])))
Не берите в голову это:
from itertools import permutations
print(list(permutations([1,2,3,4])))
Кстати, вы можете исправить свой код следующим образом:
result.append(list(tmp))
Это создаст копию вместо добавления tmp
. Но как только вы попробуете свой код с более длинным списком, таким как [1,2]
, вы столкнетесь с еще несколькими ошибками, и я не стал полностью отлаживать решение.