当前位置: 首页 > 知识库问答 >
问题:

C#递归yield返回不返回任何内容

胡飞鹏
2023-03-14

TestCase 2:

baseChars:['a','b']
所需字符串长度:1

产出:

    static IList<string> baseChars = new List<string>() { "0", "1", "2", "3" };
    static void CharsRange1(string prefix, int pos)
    {
        if (pos == 1)
        {
            foreach (string s in baseChars)
            {
                Console.WriteLine(prefix + s);
            }
        }
        else
        {
            foreach (string s in baseChars)
            {
                CharsRange1(prefix + s, pos - 1);
            }
        }
    }
    static IEnumerable<string> CharsRange2(string prefix, int pos)
    {
        if (pos == 1)
        {
            foreach (string s in baseChars)
            {
                yield return prefix + s;
            }
        }
        else
        {
            foreach (string s in baseChars)
            {
                // here if i yield return then won't compile
                // i thought at the end of recursive loop it will return 
                CharsRange2(prefix + s, pos - 1);
            }
        }
    }
    static void Main(string[] args)
    {
        //CharsRange1("", 3);//working
        foreach (string s in CharsRange2("", 3))
        {
            Console.WriteLine(s);//nothing
        }
        Console.WriteLine("end");
        Console.ReadKey();
    }

有人能帮忙吗?我已经把我的代码放在GitHub里了。如果您可以将我的实现更改为非递归,但保留函数返回类型,也将受到重视。

共有1个答案

申屠裕
2023-03-14

选项1,从递归调用中产生每个值。

    foreach (string s in baseChars)
        foreach (var r in CharsRange2(prefix + s, pos - 1))
            yield return r;

选项2,重用框架中内置的现有IEnumerable类型,以完全避免yield返回;

    if (pos == 1)
        return baseChars.Select(s => prefix + s);
    else
        return baseChars.SelectMany(s => CharsRange2(prefix + s, pos - 1));

选项3,使用嵌套循环而不是递归方法,留给读者作为练习。

 类似资料:
  • 问题内容: 我有一个像这样的递归函数 我正在使用它 我注意到您好永远不会返回,因为我怀疑我在递归调用上创建了多个promise,但是我不确定如何从中返回。 如何返回每个递归创建的Promise? 编辑: 结果是 问题答案: 递归是一种功能性遗产,因此将其与功能性样式一起使用可产生最佳效果。这意味着编写接受和操作其输入(而不是依赖于外部状态)和返回值(而不是依赖于突变或副作用)的函数。 你的程序,而

  • 我有一个像这样的mysql表 但是我无法用这个函数检索“成人”和“儿童”的值 错误日志显示变量被正确地传递给函数: 为什么此函数返回?

  • 问题内容: 我有这段代码,由于某种原因,当我尝试返回路径时,我得到None: 有办法解决吗?提前致谢。 问题答案: 你需要返回递归结果: 否则,该函数仅在执行该语句后结束,导致None返回。 你可能要下降了,总是返回结尾: 因为如果是,False那么你也将在没有功能的情况下结束功能return。如果在这种情况下None递归不是正确的选择,而在返回则不是正确的选择,那么你也需要处理这种边缘情况。

  • 如何获取java主目录? 这样做的时候 一无所获

  • 我的问题是: 接下来我用 它返回[],即不返回任何内容 但是如果我设置cursor=conn.cursor(),同样的查询会返回一些行!怎么了?为什么我不能使用游标?

  • 我有一个递归函数,它会重复这个函数,直到不满足if条件,然后输出一个整数。但是,此函数之外需要整数的函数正在接收一个单位。我应该如何修改代码以返回int? 这就是整个程序 }