Можно ли упростить рекурсию?

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));
}
→ Ссылка