笛卡尔积
3个JS版本
版本一 性能好些,
版本二性能差些,
版本三性能和版本1差不多
版本一
递归入参:
array:当前的数组
result:结果集
递归结束条件:array长度为0
function cartesian(array, result){
if(array.length === 0){
return [result]
}
let currentResult = []
const cItem = array[0]
if(Array.isArray(cItem)){
for(const i in cItem){
const res = res.slice()
res.push(cItem[i])
currentResult = currentResult.concat(cartesian(array.slice(1), res))
}
} else {
result.push(cItem)
currentResult = currentResult.concat(cartesian(array.slice(1), result))
}
return result
}
版本二
递归入参:
item: 当前item
array:变化的数组
递归结束条件:array长度为0
function cartesian(item, array){
const temp = []
if (array && array.length > 0) {
const nextItem = array.shift()
const res = cartesian(nextItem, array)
if (!Array.isArray(item)) {
item = [item]
}
for (const i in item) {
for (const j in res) {
const ss = res[j].concat()
ss.unshift(item[i])
temp.push(ss)
}
}
} else {
if (!Array.isArray(item)) {
item = [item]
}
for (const i in item) {
temp.push([item[i]])
}
}
return temp
}
版本三:
递归参数:array
递归结束条件:array长度为0
function cartesian(array){
const temp = []
if (array && array.length > 0) {
let item = array[0]
const res = cartesian(array.slice(1))
if (!Array.isArray(item)) {
item = [item]
}
if(res.length === 0){
for (const i in item) {
temp.push([item[i]])
}
} else {
for (const i in item) {
for(const j in res){
const temps = res[j].concat()
temps.unshift(item[i])
temp.push(temps)
}
}
}
}
return temp
}
检测:
const obj = {
12:3,
23:[2,3],
34:0
}
console.time('testTime1')
const arr = Object.values(obj)
const res = cartesian(arr)
console.log(res)
console.timeEnd('testTime1')