实现 n 重循环的算法,n 是变量,且每重循环的循环次数也是变量。例如:
传入参数是 [1, 2],那么意味着外层循环数是 1,内层循环数数是 2。
如果传入参数是 [2, 2, 1],那么意味着最外层循环数是 2,次层循环数数是 2,最内层循环数是 1,依此类推。
要求打印出每一次循环的维度索引。
用 javascript 伪码表示为:
var dims = [2, 2]
loopGen = require('your-generator')(dims)
for indexes of loopGen
console.log(indexes)
结果应该是:
[0, 0]
[0, 1]
[1, 0]
[1, 1]
类似地,如果输入是 var dims = [2,2,2]
,那么结果是:
[ 0, 0, 0 ]
[ 0, 0, 1 ]
[ 0, 1, 0 ]
[ 0, 1, 1 ]
[ 1, 0, 0 ]
[ 1, 0, 1 ]
[ 1, 1, 0 ]
[ 1, 1, 1 ]
这段 javascript 伪代码用到了 generator
和 for of
语法,你在实现时不用考虑是否采用类似语法,只要确保能够根据传入的动态维度信息来执行循环即可。
方案1:递归方式
export const loopGen = (arr, result=[], index = 0) => {
var curIndex = arr[index]
var indexTemp = index
for (var i = 0; i < curIndex; i++) {
var tmpResult = result.concat()
tmpResult.push(i)
if (++index < arr.length) {
loopGen (arr, tmpResult, index)
} else {
console.log(tmpResult)
}
index = indexTemp
}
}
方案2:利用一重数组实现
export const loopGen = (arr) => {
let queue = [[]]
while(arr.length){
let n = arr.shift()
let len = queue.length // 总循环数
while(len--){
let cur = queue.shift()
for(let j = 0 ; j < n; j++){
queue.push(cur.concat(j))
}
}
}
return queue
}