主要应用场景:对账。
需要对未办结的数据进行尽可能的金额匹配,解决思路是计算出所有的匹配可能,然后计算出这些可能性的所有金额。
再从这些金额中匹配相等项,则对账成功。
下面是获取数组所有排列组合方式的实现代码,输入一个数组,返回包含这个数组组合方式的新数组:
// 左移位
Function shl(num, c)
Dim a = 2
For i = 2 to c
a = a * 2
next
return a * num
end Function
// 右移位
Function shr(num, c)
for i = 1 to c
num = Math.Int(num / 2)
next
return num
end Function
// 求一个数组元素的所有排列组合
Function 求数组组合(arr)
Dim arrRet = []
Dim arrRet_Count = 0
Dim iSize = len(arr)
Dim iCount = shl(1, iSize) - 1
for i = 1 to iCount
Dim arrItem = []
Dim arrItem_Count = 0
Dim iCurPos = iSize - 1
Dim iNumber = i
Do While (iNumber <> 0)
if (iNumber Mod 2) = 1
if arr[iCurPos] <> null
arrItem[arrItem_Count] = arr[iCurPos]
arrItem_Count = arrItem_Count + 1
end if
end if
iNumber = shr(iNumber, 1)
iCurPos = iCurPos - 1
Loop
arrRet[arrRet_Count] = arrItem
arrRet_Count = arrRet_Count + 1
next
return arrRet
End Function
TracePrint 求数组组合([1, 2, 3, 4, 5, 6])
运行后,得到结果如下:
[ [ 6 ], [ 5 ], [ 6, 5 ], [ 4 ], [ 6, 4 ], [ 5, 4 ], [ 6, 5, 4 ], [ 3 ], [ 6, 3 ], [ 5, 3 ], [ 6, 5, 3 ], [ 4, 3 ], [ 6, 4, 3 ], [ 5, 4, 3 ], [ 6, 5, 4, 3 ], [ 2 ], [ 6, 2 ], [ 5, 2 ], [ 6, 5, 2 ], [ 4, 2 ], [ 6, 4, 2 ], [ 5, 4, 2 ], [ 6, 5, 4, 2 ], [ 3, 2 ], [ 6, 3, 2 ], [ 5, 3, 2 ], [ 6, 5, 3, 2 ], [ 4, 3, 2 ], [ 6, 4, 3, 2 ], [ 5, 4, 3, 2 ], [ 6, 5, 4, 3, 2 ], [ 1 ], [ 6, 1 ], [ 5, 1 ], [ 6, 5, 1 ], [ 4, 1 ], [ 6, 4, 1 ], [ 5, 4, 1 ], [ 6, 5, 4, 1 ], [ 3, 1 ], [ 6, 3, 1 ], [ 5, 3, 1 ], [ 6, 5, 3, 1 ], [ 4, 3, 1 ], [ 6, 4, 3, 1 ], [ 5, 4, 3, 1 ], [ 6, 5, 4, 3, 1 ], [ 2, 1 ], [ 6, 2, 1 ], [ 5, 2, 1 ], [ 6, 5, 2, 1 ], [ 4, 2, 1 ], [ 6, 4, 2, 1 ], [ 5, 4, 2, 1 ], [ 6, 5, 4, 2, 1 ], [ 3, 2, 1 ], [ 6, 3, 2, 1 ], [ 5, 3, 2, 1 ], [ 6, 5, 3, 2, 1 ], [ 4, 3, 2, 1 ], [ 6, 4, 3, 2, 1 ], [ 5, 4, 3, 2, 1 ], [ 6, 5, 4, 3, 2, 1 ] ]