Рекурсивная версия неэффективна из-за повторных вызовов SubArray
, что делает сложность по времени O (n 2 ). Вы можете переписать эту функцию так, чтобы она принимала дополнительный параметр индекса, что также является способом реализации пропуска определенного индекса (или набора индексов, если вы выберете).
В C #:
private static int SumSkipIndex(int[] arr, int skip, int i)
{
if (i >= arr.Length) return 0;
return (i == skip ? 0 : arr[i]) + SumSkipIndex(arr, skip, i + 1);
}
Если вам не нравится добавленный параметр i
, который изменяет заголовок функции, просто напишите отдельную частную рекурсивную «вспомогательную» функцию, которую можно вызывать из оболочки с вашим предпочтительным заголовком.
Я также предполагаю, что вы не хотите жесткий код index 2 в алгоритм (если вы это сделаете, удалите параметр skip
и замените i == skip
на i == 2
).
using System;
class MainClass
{
private static int SumSkipIndex(int[] arr, int skip, int i)
{
if (i >= arr.Length) return 0;
return (i == skip ? 0 : arr[i]) + SumSkipIndex(arr, skip, i + 1);
}
public static int SumSkipIndex(int[] arr, int skip)
{
return SumSkipIndex(arr, skip, 0);
}
public static void Main(string[] args)
{
Console.WriteLine(SumSkipIndex(new int[]{16, 11, 23, 3}, 1)); // => 42
}
}
Наконец, имейте в виду, что рекурсия - ужасный выбор для такого рода алгоритма (суммирование массива), даже с индексной версией. Мы должны вызвать новую функцию только для обработки одного числа, что означает, что у нас много служебных вызовов (распределение кадров стека) и мы можем легко перебить стек, если список слишком длинный. Но я предполагаю, что это всего лишь учебное упражнение.