我试图在C#中编写一个递归函数,它将采用两个参数,一个数组和一个索引。索引应该在每次递归时改变,但是开始是数组的长度 - 。
像这样:
public static int[] UpArray(int[] num, int i = num.Length - 1) {...}
但是,我不能引用num。我可以传递一个布尔值,说明这是否是第一次通过,并在代码中包含if子句。但我想知道是否有更优雅的方式。
答案 0 :(得分:9)
不,可选参数的默认值是常量。
您可以使用-1
作为注释中建议的默认值,或者将其设为可为空的int并将其默认为null:
public static int[] UpArray(int[] num, int? index = null)
{
int realIndex = index ?? num.Length - 1;
...
}
或者更好的是,只需要两种方法:
public static int[] UpArray(int[] num)
{
return UpArray(num, num.Length - 1);
}
private static int[] UpArray(int[] num, int index)
{
...
}
假设你没有希望外部调用者实际指定索引 - 你只想在递归调用上执行此操作。
不需要任何可选参数,整体API就是您真正想要的,而不是让实现细节透视。
答案 1 :(得分:1)
我建议使用匿名方法:
public static int[] UpArray(int[] num) {
Func<int[], int> f = null;
f = (int[] num, int i) => {
//Do something and then something like:
f(num, num.Length - 1);
};
f(num, num.Length);
}
这种方法的好处是你可以调用的唯一方法是外部方法;内部的匿名方法无法调用。它很干净,并没有污染命名空间。当您要调用该方法时,只有一个方法,并且没有调用错误方法的风险(或者只是试图找出要调用的方法。)
答案 2 :(得分:1)
使用不需要索引的重载可能更优雅。这也将允许函数在需要时用作方法组来代替lambda,因为lambdas不能使用可选参数&#39;默认值
public static int[] UpArray(int[] num) { return UpArray(num, num.Length - 1); }
public static int[] UpArray(int[] num, int index)
{
//...
}
这也允许你隐藏内部函数,如果你想强制实现总是从最后开始使用:
public static int[] UpArray(int[] num) //...
private static int[] UpArray(int[] num, int index) //...