使用递归输出数组

Outputting an array using recursion

提问人:pointlessya 提问时间:11/15/2023 最后编辑:pointlessya 更新时间:11/15/2023 访问量:97

问:

我正在尝试使用递归写入数组的内容。我的代码如下所示:

static void Foo(int[] myArray)
{
    int i = 0;
    Console.WriteLine(myArray[i]);

    if (i < myArray.Length)
        return;

    i++;

    Foo(myArray);
}
static void Main(string[] args)
{
    int[] myArray = {4,6,78,9,0};

    Foo(myArray);
}

但是,当我执行应用程序时,而不是预期的输出:

4
6
78
9
0

它只打印第一个元素:

4

我希望得到一些建议,以帮助我找到正确的解决方案

C# 数组 递归

评论

2赞 David 11/15/2023
欢迎来到 Stack Overflow!相关代码和错误消息需要以文本形式包含在您的问题中,而不是文本图片。仅仅链接到屏幕截图会使人们更难帮助您。要了解有关此社区的更多信息以及我们如何为您提供帮助,请从导览开始并阅读如何提问及其链接资源。
0赞 David 11/15/2023
此外。。。这是您开始熟悉调试器使用的好机会。在调试器中单步执行代码时,哪个操作首先会产生意外结果?该操作中使用的值是什么?结果如何?预期的结果是什么?为什么?

答:

5赞 rgher 11/15/2023 #1

该变量不维护不同函数调用之间的状态。i

相反,您需要将参数传递给函数,并使用递归调用对其进行更新。i

static void Foo(int[] arr, int i) {
    if (i >= arr.Length) return;

    Console.WriteLine(arr[i]);
    Foo(arr, i + 1);
}

然后打电话进来:Main

Foo(myArray, 0);
2赞 Joel Coehoorn 11/15/2023 #2

这是另一种有趣的选择:

// Foo() is now generic and expects an IEnumerable, instead of an array
static void Foo<T>(IEnumerable<T> arr) 
{
    Console.WriteLine(arr.First());
    var next = arr.Skip(1);
    if (next.Any()) Foo(next);
}

// but Main() is UNCHANGED: still using an int array
static void Main(string[] args) 
{
    int[] myArray = {4,6,78,9,0};
    Foo(myArray);
}

在这里看到它的工作:

https://dotnetfiddle.net/053Bbp

如果您只是查找递归,则可能不熟悉泛型、IEnumerable 或 LinQ 操作。然而,这些特性对语言来说非常重要,你会希望最终理解它们。使用它们的次数是递归的 1000 倍。

在这种情况下,它们可能会使代码稍微慢一些,但不会以您可能会注意到的方式。新代码还具有处理任何类型的集合(而不仅仅是数组)的优点,其中项对方法具有合理的重写。也就是说,代码的功能更强,可重用性更强。该代码也“更简洁”,因为它只需要一个参数。ToString()Foo()

2赞 Enigmativity 11/15/2023 #3

也许可以考虑制作一个数组。然后你可以这样写:Span<int>

static void Foo(Span<int> span)
{
    if (span.Length > 0)
    {
        Console.WriteLine(span[0]);
        Foo(span.Slice(1));
    }
}

static void Main(string[] args)
{
    int[] myArray = { 4, 6, 78, 9, 0 };
    Foo(myArray);
}