实现 n 重循环的算法,n 是变量,且每重循环的循环次数也是变量

实现 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 伪代码用到了 generatorfor 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
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值