py-code-元素组合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# 构建数组元素的组合
def MakeArrayCombination() :
arrI = [1, 2, 3, 4]
arrGoodsSplitCopy = arrI.copy()

tryDepth = 0 # 当前尝试组合的深度
maxTryDepth = len(arrI) # 最大尝试组合深度
arrTryNumMax = [] # 存储每个深度需要尝试的次数
arrTryNum = [] # 存储每个深度已经尝试的次数
arrTryValue = [] # 存储当前尝试的组合
arrTryArrayPop = [] # 存储每个深度尝试的数组
arrTryArrayBake = [] # 存储每个深度尝试的数组的备份

# 初始化尝试的信息
i = 0
while i < maxTryDepth :
arrTryNumMax.append(maxTryDepth-i)
arrTryNum.append(0)
arrTryValue.append(0)
arrTryArrayPop.append([])
arrTryArrayBake.append([])

i += 1

#print(arrTryNumMax)

outDepth = 0
while outDepth < maxTryDepth :

# 添加当前层所有值到对应的数组
inDepth = 0
while inDepth < maxTryDepth :
if inDepth == 0:
# 第0层,上面已经没有层级,只能特殊处理
curDepthArray = arrGoodsSplitCopy.copy()

val = arrGoodsSplitCopy.pop(0)
arrGoodsSplitCopy.append(val)

arrTryArrayPop[inDepth] = curDepthArray
arrTryArrayBake[inDepth] = curDepthArray.copy()
else:
# 非第一层,用上一层的进行赋值处理
curDepthArray = arrTryArrayBake[inDepth-1].copy()
curDepthArray.pop(0)

arrTryArrayPop[inDepth] = curDepthArray
arrTryArrayBake[inDepth] = curDepthArray.copy()

#print("depth %s : %s " % (inDepth, arrTryArrayPop[inDepth]))

inDepth += 1

# 组合当前层的所有值
# 0层
tryDepth = 0
curDepthArrayPop = arrTryArrayPop[tryDepth]
val = curDepthArrayPop.pop(0)
arrTryValue[tryDepth] = val

# 后面层
tryDepth += 1
while tryDepth != 0 :

if len(arrTryArrayPop[tryDepth]) != 0:
# 只要不是0层都弹出数据
curDepthArrayPop = arrTryArrayPop[tryDepth]
val = curDepthArrayPop.pop(0)
arrTryValue[tryDepth] = val

if tryDepth == maxTryDepth - 1 :
# 最高层
print("当前组合数据 %s " % (arrTryValue))

if len(arrTryArrayPop[tryDepth]) == 0:
# 当前层已经没有数据了,返回上一层
while len(arrTryArrayPop[tryDepth]) == 0 :
tryDepth -= 1

if tryDepth == 0 :
break

if tryDepth != 0 :
# 不是0层,重置后面层的数据
curDepthArrayPop = arrTryArrayPop[tryDepth]
curDepthArrayBake = arrTryArrayBake[tryDepth]

#print(" %s : %s %s " % (tryDepth, curDepthArrayPop, curDepthArrayBake))

# 当前层换新数据
val = curDepthArrayPop.pop(0)
arrTryValue[tryDepth] = val

# 当前层数据顺序更换
val = curDepthArrayBake.pop(0)
curDepthArrayBake.append(val)


# 重置后面层的数据
curDepthArrayBakeCopy = arrTryArrayBake[tryDepth].copy()
childIdx = tryDepth + 1
while childIdx < maxTryDepth:
val = curDepthArrayBakeCopy.pop(0)

arrTryArrayPop[childIdx] = curDepthArrayBakeCopy.copy()
arrTryArrayBake[childIdx] = curDepthArrayBakeCopy.copy()

childIdx += 1

if tryDepth != 0 :
tryDepth += 1

outDepth += 1