实现一串数据的全排列是一个非常经典的问题
今天我来分享两种求法
首先是递归法
def all_words_recursive(s, i):
if i == len(s):
print(''.join(s))
else:
for j in range(i, len(s)):
s[j], s[i] = s[i], s[j]
all_words_recursive(s, i + 1)
s[j], s[i] = s[i], s[j]
然后是迭代法
def factorial_recursion(n):
if n == 1:
return 1
return n * factorial_recursion(n - 1)
def all_words_iterative(letter):
n = len(letter)
permutation_list = [0 for i in range(factorial_recursion(n))]
temporary_list = [letter[0]]
for temp_x in range(2, n + 1):
count = 0
for temp_i in temporary_list:
for temp_j in temp_i:
permutation_list[count] = temp_i.replace(temp_j, letter[temp_x - 1] + temp_j)
count += 1
permutation_list[count] = temp_i + letter[temp_x - 1]
count += 1
temporary_list = [permutation_list[i] for i in range(factorial_recursion(temp_x))]
for i in temporary_list:
print(i)
整合版如下
def all_words_recursive(s, i):
if i == len(s):
print(''.join(s))
else:
for j in range(i, len(s)):
s[j], s[i] = s[i], s[j]
all_words_recursive(s, i + 1)
s[j], s[i] = s[i], s[j]
def factorial_recursion(n):
if n == 1:
return 1
return n * factorial_recursion(n - 1)
def all_words_iterative(letter):
n = len(letter)
permutation_list = [0 for i in range(factorial_recursion(n))]
temporary_list = [letter[0]]
for temp_x in range(2, n + 1):
count = 0
for temp_i in temporary_list:
for temp_j in temp_i:
permutation_list[count] = temp_i.replace(temp_j, letter[temp_x - 1] + temp_j)
count += 1
permutation_list[count] = temp_i + letter[temp_x - 1]
count += 1
temporary_list = [permutation_list[i] for i in range(factorial_recursion(temp_x))]
for i in temporary_list:
print(i)
s = 'asd'
print('递归')
all_words_recursive(list(s), 0)
print('迭代')
all_words_iterative(s)
效果图:
一起学习python,小白指导,教学分享记得私信我