Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C递归循环_Java_C#_Recursion - Fatal编程技术网

Java C递归循环

Java C递归循环,java,c#,recursion,Java,C#,Recursion,我有这些数据 string [] letters = {"a","b","c"}; 我想要一个像generateString1这样的函数 如果值为1,则输出为: a b c 如果为generateString3,则输出为 a b c aa ab ac ba bb bc ca cb cc aaa aab aac aba abb abc aca and so on... 我可以这样做 foreach(var a in data){ foreach(var b in data){ fore

我有这些数据

string [] letters = {"a","b","c"};
我想要一个像generateString1这样的函数 如果值为1,则输出为:

a
b
c
如果为generateString3,则输出为

a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
aba
abb
abc
aca and so on...
我可以这样做

foreach(var a in data){
 foreach(var b in data){
  foreach(var c in data){
    Console.WriteLine(a + b + c);
  }
 }
}
它最多只能生成3个,如果我想将其设置为4,那么我会添加另一个foreach,我认为这不是一个更好的主意


有什么建议吗?

看起来像这样

List<List<String>> foo(int i){
    if(i==1){
        return new List<List<String>>(new List<String>("a", "b", "c"));
    } else{
        var result = new List<List<String>>();
        foreach(List<String> list in foo(i-1)){
            foreach(String elem in new String[]{"a", "b", "c"}){
               var tmp = new List<String>(list);
               tmp.Add(elem);
               result.Add(tmp);
            }
        }
        return result;
    }
}
我不确定sintax和list构造函数,但总体思路如下所示

static string[] generateString(string[] letters, int len)
{
    if (len < 0) throw new ArgumentOutOfRangeException("length can't be less than zero.");
    switch (len)
    {
        case 0: return new string[0];
        case 1: return letters;
        default:
            // all possible combinations which are shorter than required 
            // recursion is used here
            var shorter_x = generateString(letters, len - 1).ToArray();

            // all combinations which have length = len - 1
            var shorter_1 = shorter_x.Where(line => line.Length == len - 1).ToArray();

            // resulting array
            return shorter_x.Union(letters.SelectMany(letter => shorter_1.Select(shorter => letter + shorter))).ToArray();
    }
}
会更加一致。在这种情况下,函数将如下所示

static string[] generateString(char[] letters, int len)
{
    if (len < 0) throw new ArgumentOutOfRangeException("length can't be less than zero.");
    switch (len)
    {
        case 0: return new string[0];
        case 1: return letters.Select(char.ToString).ToArray();
        default:
            ......

如果你做了递归,它会是什么样子?你试过什么吗?在尝试之前,你可以试着研究一下递归是什么。。请别人帮你试试。它真的很有效!但我想使用生成的每个字符串。如果我要使用generateString20,我的计算机会崩溃,因为它无法处理存储到一个变量的大数据。你可以尝试使用非递归版本。和惰性迭代器
static string[] generateString(char[] letters, int len)
{
    if (len < 0) throw new ArgumentOutOfRangeException("length can't be less than zero.");
    switch (len)
    {
        case 0: return new string[0];
        case 1: return letters.Select(char.ToString).ToArray();
        default:
            ......