定义
回溯算法也可以理解为穷举法,是穷举法的一个巧妙实现,也可以叫试探法,是一种系统搜索问题的解决办法,是暴力搜索的一种。
基本思想
回溯法使用的是试错的思想,他通过分步骤的方式来解决问题,在不同的步骤上尝试,在分步解答的过程中,如果发现分步答案得不到正确的解答,它将退回到上一步或者上几步的计算,在通过其他的分步解答再次尝试寻找答案,回溯算法通常通过简单的递归来实现,在重复上述过程中可能出现两种结果:
- 查找到可能存在的答案
- 尝试了所有的情况宣告没有正确答案
通俗的来说就是在一条路上一直走,如果能进则进,不能进则退回来,换一条路继续走,直到找到正解,或者走完所有的路为止。
问题
我们通过解决一个问题来学习回溯算法;
现在有列表 nums = [1,2,3]
要你求出该列表所有可能的排列并存储在另一个列表中。
我们将可能的组合方式看做一棵树;
可以发现总共有 种组合方式,符合条件的结果是[[1,2,3],[1,3,2],......[3,2,1]]
,关键在于咱们如何使用代码来筛选出符合条件的结果并存入到列表中。
代码编写:
nums = [1,2,3]
result = []
def back(tempList,nums):
if len(tempList) == len(nums):
result.append(tempList.copy()) #满足条件的回溯点
for i in nums: #遍历
if i in tempList:
continue
else:
tempList.append(i)
back(tempList,nums) #回溯
tempList.pop()
for n in nums:
tempList = []
tempList.append(n)
back(tempList,nums)
print(result)