将此嵌套for循环更改为递归

时间:2017-01-29 21:01:13

标签: c# .net for-loop recursion

我发布了this similar, previous question,但我不太清楚。

我有以下代码:

int N=4;
int[] myArray = new int[N];
for (int i1 = 1; i1 < N; i1++)
    myArray[0]=i1;
    for (int i2 = 1; i2 < N; i2++)
        myArray[1]=i2;
            for (int i3 = 1; i3 < N; i3++)
                myArray[2]=i3;
                for (int i4 = 1; i4 < N; i4++)
                {
                    myArray[3]=i4;

                    foreach (var item in myArray)
                        Console.Write(item.ToString());
                    Console.Write(Environment.NewLine);
                }

这输出以下内容:

1111
1112
1113
1121
1122
1123
1131
....
3332
3333

是否有一种简单的方法可以将此嵌套for循环更改为递归?我不是很擅长编程,所以越简单越好。我并不担心代码的效率如何。

我实际上希望能够将代码中的int N更改为不同的数字,而无需在代码中添加或删除任何内容。

修改

这是我到目前为止所做的:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

namespace Sandbox
{
    class Program
    {

        static void Main(string[] args)
        {
            int class_length = 4;
            int[] toric_class = Enumerable.Repeat(1, class_length).ToArray();
            Recursion(toric_class, class_length, 1, 3);

            Console.Read();
        }
        static void Recursion(int[] toric_class, int length, int number, int spot)
        {
            if (number < 4)
            {
                toric_class[spot] = number;
                foreach (var item in toric_class)
                {
                    Console.Write(item.ToString());
                }
                Console.Write(Environment.NewLine);
                Recursion(toric_class, length, number + 1, spot);
            }
        }
    }
}

这只输出

1111
1112
1113

我不确定从这里去哪里。

2 个答案:

答案 0 :(得分:1)

public static void Set(int[] array, int index, int N)
{
    if (index == N)
    {
        foreach (var item in array)
            Console.Write(item.ToString());
        Console.Write(Environment.NewLine);
        return;
    }
    for (int i = 1; i < N; i++)
    {
        array[index] = i;
        Set(array, index + 1, N);
    }
}

并以这种方式称呼它:

int N = 4;
int[] myArray = new int[N];
Set(myArray, 0, N);

答案 1 :(得分:1)

如果你只想简化概括 solition,你不需要任何递归:

// N - length of the array
// K - kind of radix; items of the array will be in [1..K] range
private static IEnumerable<int[]> Generator(int N = 4, int K = 3) {
  int[] items = Enumerable
    .Repeat(1, N)
    .ToArray();

  do {
    yield return items.ToArray(); // .ToArray() : let's return a copy of the array

    for (int i = N - 1; i >= 0; --i)
      if (items[i] < K) {
        items[i] += 1;

        break;
      }
      else
        items[i] = 1;
  }
  while (!items.All(item => item == 1)); 
}

测试

string test = string.Join(Environment.NewLine, Generator(4)
  .Select(items => string.Concat(items)));

Console.Write(test);

结果:

1111
1112
1113
1121
1122
...
3321
3322
3323
3331
3332
3333