• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rekurencja - zliczanie sumy liczb w tablicy

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
3,846 wizyt
pytanie zadane 16 sierpnia 2016 w C i C++ przez danielek110795 Użytkownik (820 p.)

Witam. Uczę się rekurencji. Większość zadań zrobiłem ale to mi coś nie chodzi. Potrzebuje zliczyć sume wszystkich elementów tablicy za pomocą rekurencji (suma musi być przekazywana jako parametr do funkcji). Oto kod:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 10

void wypelnij (int tab[])
{
    int i;
    srand(time(NULL));
    for (i=0; i<N; i++)
        tab[i]=rand()%10;
}

void wypisz (int tab[])
{
    int i;
    for (i=0; i<N; i++)
        printf("%3d", tab[i]);
}

int suma(int tab[], int rozmiar, int sumaa)
{

    if (rozmiar==0)
        return sumaa=sumaa+tab[rozmiar];
    else
    {
        int i=tab[rozmiar];
        return sumaa+suma(tab, rozmiar-1, sumaa+i);
}
}

int main()
{
    int tab[N];
    wypelnij(tab);
    wypisz(tab);
    int sumaa=0;
    printf("\nSuma to %d", suma(tab, N-1, sumaa));
    return 0;
}

 

Błąd jest gdzieś w funkcji suma lub przy jej wywoływaniu bo źle zlicza. Liczę na Waszą pomoc.

1 odpowiedź

+2 głosów
odpowiedź 16 sierpnia 2016 przez ribeiro Stary wyjadacz (11,440 p.)
wybrane 16 sierpnia 2016 przez danielek110795
 
Najlepsza

Zauważ, że w wywołaniu funkcji wewnątrz funkcji:

 int i=tab[rozmiar];
 return sumaa + suma(tab, rozmiar-1, sumaa+i);

Już zwiększasz wartość zmiennej sumaa w wywołanej funkcji poprzez "sumaa+i". A więc funkcja rekurencyjnie zwróci wartość nowej sumy, ale do tego jeszcze doda wartość obecnej zmiennej sumaa, co znacząco zwiększy wynik. Wystarczy usunąć jedno dodawanie:

 int i=tab[rozmiar];
 return suma(tab, rozmiar-1, sumaa+i);

Poza tym warto bardziej urozmaicać nazwy zmiennych, bo suma i sumaa mogą się mylić:)

komentarz 16 sierpnia 2016 przez danielek110795 Użytkownik (820 p.)
Dzięki, teraz liczy dobrze :)

Podobne pytania

0 głosów
1 odpowiedź 1,356 wizyt
pytanie zadane 19 grudnia 2017 w Java przez Ohnne Nowicjusz (180 p.)
0 głosów
1 odpowiedź 837 wizyt
0 głosów
1 odpowiedź 1,994 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez AndekQR Użytkownik (880 p.)

93,176 zapytań

142,186 odpowiedzi

321,980 komentarzy

62,507 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1637p. - dia-Chann
  2. 1614p. - Łukasz Piwowar
  3. 1599p. - CC PL
  4. 1597p. - Łukasz Eckert
  5. 1572p. - Tomasz Bielak
  6. 1537p. - Łukasz Siedlecki
  7. 1531p. - rucin93
  8. 1509p. - rafalszastok
  9. 1356p. - ssynowiec
  10. 1341p. - Mikbac
  11. 1328p. - Michal Drewniak
  12. 1273p. - Adrian Wieprzkowicz
  13. 1169p. - Grzegorz Aleksander Klementowski
  14. 1155p. - Piotr Aleksandrowicz
  15. 1149p. - Michał Telesz
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...