Можно ли упростить рекурсию?
public static int sum(int[] array, int index)
{
if (array.Length == index) return 0;
else return array[index] + sum(array, index + 1);
}
Начинаю понемногу разбираться в рекурсивных алгоритмах. Однако в C# столкнулся с той проблемой, что приходится таскать с собой вместе с массивом еще одну переменную.В то время как в Python эта функция выглядела бы так :
def sum(list):
if list == []:
return 0
return list[0]+sum(list[1:])
Можно ли на C# как-то упростить мой метод?
Ответы (2 шт):
Автор решения: tym32167
→ Ссылка
Чтобы не таскать переменные, пользуйтесь значениями по умолчанию.
public static int sum(int[] array, int index = 0)
{
if (array.Length == index) return 0;
else return array[index] + sum(array, index + 1);
}
Как использовать
int[] data = new int[0];
Console.WriteLine(sum(data));
Если хочется еще проще, есть методы расширения
public static class IntArrayExtensions
{
public static int sum(this int[] array, int index = 0)
{
if (array.Length == index) return 0;
else return array[index] + sum(array, index + 1);
}
}
Использование
int[] data = new int[0];
Console.WriteLine(data.sum());
Автор решения: Grundy
→ Ссылка
В примере с питоном используются списки, поэтому логичнее было бы и в c# пользоваться списками:
public static int sum(List<int> array)
{
if (array.Count == 0) return 0;
else return array[0] + sum(array.GetRange(1, array.Count-1));
}
Либо с использованием linq и метода Skip
public static int sum(IEnumerable<int> array)
{
if (!array.Any()) return 0;
else return array.First() + sum(array.Skip(1));
}