zoukankan      html  css  js  c++  java
  • 如何遍历维数和各维上限未定的多维数组

    这个题目,不方便使用递归!

    直觉告诉我,可以用两层遍历,外面一层是维数,里面一层是每一维。但实际上,要做起来很难!

    最后决定最外层循环用元素个数,里面配合使用维数的循环,最终解决问题!

    static void ArrEnum(Array arr, Action<Int32[]> func)
    {
        Int32[] ix = new Int32[arr.Rank];
        Int32 rank = 0;
    
        for (int i = 0; i < arr.Length; i++)
        {
            // 当前层以下都清零
            for (int j = rank + 1; j < arr.Rank; j++)
            {
                ix[j] = 0;
            }
    
            // 设置为最底层
            rank = arr.Rank - 1;
    
            //do something
            //arr.SetValue(i, ix);
            func(ix);
    
            // 当前层递加
            ix[rank]++;
    
            // 如果超过上限,则减少层次
            while (ix[rank] >= arr.GetLength(rank))
            {
                rank--;
                if (rank < 0) break;
                ix[rank]++;
            }
        }
    }
    
    static void Test2()
    {
        Int32[, , ,] arr = new Int32[24, 24, 24, 24];
    
        Int32 n=1;
        ArrEnum(arr, ix => arr.SetValue(n++, ix));
        ArrEnum(arr, delegate(Int32[] ix)
        {
            Console.Write("[");
            for (int i = 0; i < ix.Length; i++)
            {
                if (i > 0) Console.Write(", ");
                Console.Write(ix[i]);
            }
            Console.Write("]\t");
            Console.WriteLine(arr.GetValue(ix));
        });
    }
    
  • 相关阅读:
    一个好的技术管理人员需要知道的几件事
    团队必经的五个阶段以及好团队的七个特征
    作为CTO如何做技术升级
    技术领导画像
    TF-IDF原理
    KNN和K-Means的区别
    图数据库入门
    Hbase和Hive的异同
    谈谈机器学习面试
    关于领导力的理解
  • 原文地址:https://www.cnblogs.com/nnhy/p/2050004.html
Copyright © 2011-2022 走看看