Вы можете исправить свой подход следующим образом:
def permutations(lista, n=0, per = ''):
f_dict = {}
if n != len(lista):
for i in range(len(lista)):
if str(i) not in per:
f_dict[i] = permutations(lista, n+1 , per + str(i))
return [x for v in f_dict.values() for x in v] # unpack and chain the lists
return [per] # return a singleton list of strings
>>> print(permutations([1, 2, 3]))
['012', '021', '102', '120', '201', '210']
Вы должны всегда возвращать один и тот же тип, в данном случае список строк. Вы возвращали одну строку в базовом регистре и ее список в рекурсивном регистре.
Кстати, содержимое передаваемого вами списка никогда не используется. Вы можете просто передать саму длину:
>>> print(permutations([6,5,4]))
['012', '021', '102', '120', '201', '210']
Каноническая рекурсивная реализация через рекурсивный генератор будет выглядеть так:
def permutations(lst):
if lst:
for i, x in enumerate(lst):
for perm in permutations(lst[:i] + lst[i+1:]):
yield [x] + perm
else:
yield []
>>> list(permutations([6,5,4]))
[[6, 5, 4], [6, 4, 5], [5, 6, 4], [5, 4, 6], [4, 6, 5], [4, 5, 6]]