涉及知识点:
1.awk里面使用函数进行递归,对N个数进行一个全排列,使用了DFS深度遍历策略
2.分别使用awk和python实现
3.我的学习视频为:用dfs深度优先搜索算法实现全排列_哔哩哔哩_bilibili
一、DFS深度遍历实现数的全排列——awk代码
BEGIN{
n=4 #n即为元素的长度
count=0 #count是用于输出计数的
for(i=0;i<n;i++){visit[i]=1} #建立一个visit数组,后续来判断元素是否被取用
for(i=0;i<n;i++){temp[i]=" "} #temp数组来保存最后的答案
for(i=0;i<n;i++){arr[i]=i+1} #arr数组来保存元素,因为我想要实现一个连续不重复数的全排列
#所以用一个for循环来给arr数组输入数值
#调用函数进入遍历
dfs(0)
}
function dfs(position,i){ #position可以看作当前所在位置,也可以认为是当前所在树的深度
#这里后面的i,是用来当作dfs函数里的局部变量
if(position==n) #if判断为函数出口
{
count=count+1
printf "第"count"组:">>"1.txt"
for(i=0;i<n;i++) #此处for循环是输出保存答案的temp数组,因为后面需要所以追加到
#一个txt中
{
printf temp[i] >> "1.txt"
printf ";" >> "1.txt"
}
print" ">>"1.txt"
return #回溯
}
#递归主体
for(i=0;i<n;i++)
{
if(visit[i]==1) #如果当前所取元素没有用过则
{
temp[position]=arr[i] #把当前所取元素给到temp数组
visit[i]=0 #并且将visit改为0,表示已经用过了
dfs(position+1) #进入下一层遍历
visit[i]=1 #当我们回溯的时候,我们要把visit改回1
}
}
}
最后的实现结果如下:
二、DFS深度遍历实现数的全排列——python代码
visit = [True, True, True, True]
temp = ["" for x in range(0, 4)]
def dfs(position):
# 递归出口
if position == len(arr):
print(temp)
return
# 递归主体
for i in range(0, len(arr)):
if visit[i] == True:
temp[position] = arr[i]
visit[i] = False # 试探
dfs(position + 1)
visit[i] = True # 回溯
arr = [1, 2, 3, 4]
dfs(0)