rekurencja C z tablica

0

Napisz funkcję rekurencyjną, która otrzyma tablicę liczb całkowitch oraz
jej rozmiar. Funkcja powinna zwrócić sumę liczb z komórek o parzystych indeksach z tej tablicy.

int suma (int tab[], int n)
{
  int sum,i;
  if (tab[i]%2==1) return 1;
  for(i=0;i<n;i++)
  	{
 		 sum = tab[i]+suma(tab[i+1],);
  	}
  return sum;
}

Jak uzywac rekurencji mając 2 lub wiecej parametrow funkcji?

0

Trochę to brzydkie, lepszego pomysłu nie miałem. Sumuje od końca. Chyba działa dla wszystkich przypadków.

int sum_even(int arr[], int n)
{
    // if num of indexes is even
    if (n % 2 == 0) {
        if (n <= 0) // stop condition
            return 0;
        return arr[n-2] + sum_even(arr, n-2);
    }
    
    else {
        if (n < 0) // stop condition
            return 0;
        return arr[n-1] + sum_even(arr, n-2);
    }
}
int main()
{
    int mainArr[6] = {1, 2, 3, 4, 5, 6};
    std::cout << sum_even(mainArr, 6);
}
0

Zamotane to to

int sum(int *a, size_t n) {
    if(n == 0) return 0;
    if(n % 2 == 0) return sum(a, n-1);
    return a[n-1] + sum(a, n-2);
}

Czy jakoś tak.

0
int evenIndexSum(int *a, size_t n) {
    return (n ? a[n - (2 >> (n & 1))] + (n > 2 ? evenIndexSum(a, n - 2): 0): 0);
}

Sam siebie bym wychłostał za taki kod w projekcie...

0

Uparliście się na to modulo :D Wystarczy przesuwać wskaźnik.

0

jak się bawić to się bawić

Rozwiązanie w moim ulubionym języku:

(define (sum-every-other xs)
  (cond ((null? xs) 0)               ;; n == 0
        ((null? (cdr xs)) (car xs))  ;; n == 1
        (else (+ (car xs)            ;; n >= 2
                 (sum-every-other (cddr xs))))))

Pozdro dla prawdziwych!

0
int evenIndexSum(int *tab, int n)
{
    if (n == 0) return 0;
    if (n <= 2) return tab[0];
    return tab[0] + evenIndexSum(tab + 2, n - 2);
}

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