Я не уверен, что это правильный способ написать рекурсивную функцию
Код выглядит OK , но он нарушает дух использования рекурсии. 1
Такой код может быть легко выполнен с помощью простого цикла вместо n
рекурсивных вызовов.
int greaterThanFistIndex_iterate(const int *v,int n){
count = 0;
for (int i = 1; i<n; i++) {
if (v[i] > v[0]) count++;
}
return count;
}
Может может вдвое уменьшить проблему на каждом этапе.По крайней мере, он будет иметь только глубину рекурсии log2 (n), а не n
, как в коде OP.
static int greaterThanFistIndex_r_helper(const int *v,int n, int first){
if (n <= 0) {
if (n == 0) return 0;
return *v > first;
}
int first_half = n/2;
int second_half = n - first_half;
return greaterThanFistIndex_r_helper(v, first_half, first) +
greaterThanFistIndex_r_helper(v + first_half, second_half, first);
}
int greaterThanFistIndex_r(const int *v,int n){
if (n <= 0) return 0;
return greaterThanFistIndex_r_helper(v+1, n, *v);
}
Некоторые компиляторы обнаруживают конструкцию OP и выполняют оптимизацию рекурсии хвостовой части, но я вижу простой цикллучший подход.
Используйте рекурсию, когда это имеет смысл.По возможности используйте цикл.
Примечание: лучше использовать size_t
, чем int
для размера массива и индексации.(здесь не показано)
1 Код не выполняется для n <= 0
.
Лучшей сигнатурой функции будет size_t greaterThanFistIndex(const int *v, size_t n)