提问人:pointlessya 提问时间:11/15/2023 最后编辑:pointlessya 更新时间:11/15/2023 访问量:97
使用递归输出数组
Outputting an array using recursion
问:
我正在尝试使用递归写入数组的内容。我的代码如下所示:
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
我希望得到一些建议,以帮助我找到正确的解决方案
答:
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);
}
在这里看到它的工作:
如果您只是查找递归,则可能不熟悉泛型、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);
}
评论