Rekurencja i zliczanie elementów dodatnich tablicy

0

Mam do napisania funkcję, która w sposób rekurencyjny zlicza elementy dodatnie tablicy. Napisałem kod, który działa poprawnie, ale nie wiem czy jest to dobre rozwiązanie. Bardzo bym prosił o sprawdzenie, jakieś wskazówki. A najchętniej to bym wysłuchał jakiś rad na temat tego, jak można sobie ułatwić rozwiązywanie zadań rekurencyjnych. Wiem, że "żeby zrozumieć rekurencję, trzeba najpierw zrozumieć rekurencję", ale może można sobie jakoś życie ułatwić. :)

#include <stdio.h>

int dodf(int * tab, int n, int a)
{
    if(n > 0 && *tab > 0) dodf(++tab, n-1, ++a);
    else if(n>0) dodf(++tab, n-1, a);
    else return a;
}

int main(void)
{
    int tab[5] = {-5, -4, 3, 7, 9};
    int x = 0, a = 0;
    x = dodf(tab, 5, a);
    printf("%d\n", x);

    return 0;
}
0

Zacząłbym od tego, że robienie tego rekurencyjnie do idiotyzm :P
Ale kod wygląda okej, oprócz tego że można by go trochę uczytelnić:

int count_positive(int *tab, int index, int count)
{
 if (index > 0)
 {
  if (*tab > 0)
   return count_positive(++tab, index-1, ++count); else
   return count_positive(++tab, index-1, count);
 } else
  return count;
}

A najchętniej to bym wysłuchał jakiś rad na temat tego, jak można sobie ułatwić rozwiązywanie zadań rekurencyjnych

Nie próbować zamieniać łatwego algorytmu iteracyjnego na skomplikowaną rekurencję - właściwie chyba tylko tyle.

0

Problem w tym, że ja muszę tego typu zadania rozwiązywać, bo tego ode mnie wymagają. Nawet jeśli jest to bezsensowne. Wierzę, że do czegoś mi się to kiedyś przyda.
Dzięki za odpowiedź i wskazówki. :)

0

W kwestii wskazówek do rekurencji, to, moim zdaniem, najłatwiej jest zacząć od ustalenia 'warunków brzegowych', czyli kiedy funkcja zwraca konkretną wartość a nie inną funkcję. Dopiero potem ma sens zabrać się za resztę.

0

Zawsze można tak: (dowolna wartosc podaj jako dupa)

int ile_wiekszych_od_0(int* tab, int n, int dupa)
{
  if (dupa == 0)
  {
    // algorytm nierekurencyjny
  }
  else if (dupa > 0)
  {
    return ile_wiekszych_od_0(tab, n, dupa - 1);
  }
  else
  {
    return ile_wiekszych_od_0(tab, n, dupa + 1);
  }
}

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