首页 > 解决方案 > 您将如何为数学创建 n 个嵌套循环?

问题描述

因此,我试图集中精力了解如何使用变量来表示循环嵌套的次数

这是我编写的一个示例,用于模拟以下输出dimensions = 4

static void Main(string[] args)
    {

        int dimensions = 4;    // e.g. for (1, 2, 3, 4), dimensions = 4

        Console.WriteLine($"{addNumbers(dimensions)}");

        Console.ReadKey();
    }

    static long addNumbers(int dimensions)
    {
        long number = 0;

        // hard coded to be dimensions = 4
        for (int h = 0; h <= dimensions; h++)
            for (int i = 0; i <= dimensions; i++)
                for (int j = 0; j <= dimensions; j++)
                    for (int k = 0; k <= dimensions; k++)
                        number += h + i + j + k;    // just some random math

        return number;
    }

这将呈现以下的预期输出:

5000

所以要重新解决这个问题,我该如何编码以允许这个n 维?谢谢你的帮助!

标签: c#loopsnestednested-loops

解决方案


对于任意n维度,您可以借助表示维度的数组进行循环: int[] addressn

  static long addNumbers(int dimensions) {
    int[] address = new int[dimensions];

    // size of each dimension; not necessary equals to dimensions
    // + 1 : in your code, int the loops you have i <= dimensions, j <= dimensions etc.
    int size = dimensions + 1;

    long number = 0;

    do {
      //TODO: some math here
      //      i == address[0]; j = address[1]; ... etc.
      number += address.Sum(); 

      // next address: adding 1 to array
      for (int i = 0; i < address.Length; ++i) {
        if (address[i] >= size - 1)
          address[i] = 0;
        else {
          address[i] += 1;
          break; 
        }
      }
    }  
    while (!address.All(index => index == 0)); // all 0 address - items're exhausted

    return number; 
  }  

最后,让我们添加一些Linq来看看结果:

  int upTo = 5;

  string report = string.Join(Environment.NewLine, Enumerable
    .Range(1, upTo)
    .Select(i => $"{i} -> {addNumbers(i),6}"));

  Console.Write(report); 

结果:

1 ->      1 
2 ->     18
3 ->    288
4 ->   5000 // <- We've got it: 5000 for 4 dimensions
5 ->  97200

推荐阅读