【问题标题】:how to list all base n numbers without nested for loops如何在没有嵌套for循环的情况下列出所有基数n
【发布时间】:2017-01-17 18:23:46
【问题描述】:

如前所述here 问题是如何生成长度为 n 的所有可能数字,其中每个数字来自集合 {1,2,3,..., n-1} ?即如何创建所有基数为 n 的数字? 一种解决方案是使用 for 循环:

int n;
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;
    // and so on....
        for (int in = 1; in < n; in++)
        {
            myArray[n]=in;
            foreach (var item in myArray)
                Console.Write(item.ToString());
                Console.Write(Environment.NewLine);
        }

问题是当 n 改变时循环数会改变!

【问题讨论】:

标签: c# recursion


【解决方案1】:

递归解决方案是:

using System;
namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        new c().f1(3);
        Console.WriteLine("Done!");
        Console.ReadKey();
    }
}
class c
{
    public void f1(int n)
    {
        f(n-1 , n, "");
    }
    public string f(int n,int depth, string r)
    {
        if(depth == 0)
        {
            Console.WriteLine(r);
            return "";
        }
        for (int i = 1; i <= n ; i++)
        {                
            string r1 =  r + i.ToString();
            f(n, depth - 1, r1);
        }
        return "";
    }        
}
}

说明:

for n= 4

f1(4) =>
f(3,4,"")
    f(3,3,"1")
        f(3,2,"11")
            f(3,1,"111")
                f(3,0,"1111") => prints "1111"
                f(3,0,"1112") => prints "1112"
                f(3,0,"1113") => prints "1113"
                f(3,0,"1114") => prints "1114"
            f(3,1,"112")
                f(3,0,"1121") => prints "1121"
                f(3,0,"1122") => prints "1122"
                f(3,0,"1123") => prints "1123"
                f(3,0,"1124") => prints "1124"
            f(3,1,"113")
                f(3,0,"1131") => prints "1131"
                f(3,0,"1132") => prints "1132"
                f(3,0,"1133") => prints "1133"
                f(3,0,"1134") => prints "1134"
            ....
            ....
            ....

【讨论】:

  • 请添加一些解释为什么此代码有助于 OP。这将有助于为未来的观众提供一个可以学习的答案。请参阅How to Answer 了解更多信息。
  • @MikeMcCaughan 很确定这是 op 回答的
  • @nickzoum 自我回答必须符合与任何其他回答相同的质量标准。请参阅我在第一条评论中发布的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多