Zamiana na rekurencję

0

Hey, mam problem z funkcją rekurencyjną. Ktoś może mi pomóc w zamianie z iteracji poniżej funkcji na rekurencję?

 int* maximum(size_t input_size, int * t)
{
  int* curr_max = &input[0];
  for(size_t i = 1; i < input_size; ++i) 
  {
    if(input[i] > *curr_max) {
      curr_max = &input[i];
    }
  }
 
  return curr_max;
} 
2
int *maximum(size_t size,int * t)
  {
   if(!size) return 0; // to na wszelki wypadek dla zerowego rozmiaru
   if(!--size) return t;
   int *r=maximum(size,t);
   return (*r>t[size])?r:(t+size);
  }
2
int* maximum(int input_size, int* t)
{
	if(input_size <= 1){
		return t;
	}else{
		int* otherMax = maximum(input_size - 1, t + 1);
		return *t > *otherMax ? t : otherMax;
	}
}
2

Można się pokusić o zrobienie w pełni funkcyjnej wersji (czyli bez zmiennych, same stałe) z rekurencją ogonową (a więc trywialnie zamienialną na pętlę przez kompilator).

int * maximum(int const * t, int const n) {
  return (t && n > 0) ? maximumRecursive(t, n, t) : nullptr;
}
int * maximumRecursive(int const * t, int const n, int const * max) {
  return n == 0 ? max : maximumRecursive(t + 1, n - 1, (*t > *max ? t : max));
}

Consty można powyrzucać. Wada jest oczywista: podejście wymaga dodatkowej funkcji (tutaj: maximumRecursive).

Kod nietestowany :]

Edit:
W sumie twoja funkcja ma podobne własności: to też rekurencja ogonowa. Zaraz się jej przyjrzę.

0

Niestety Twoja funkcja mi się nie kompiluję. 'nullptr was not declared in this scope'

0

Dzięki wielkie, już wszystko mi działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1