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

C rekurencja

Object Storage Arubacloud
0 głosów
3,470 wizyt
pytanie zadane 24 października 2017 w C i C++ przez Ditrix Mądrala (5,650 p.)

Witam.

Rekurencja po wczytywaniu warunku zwracającego liczbę całkowitą kończy obieg. Nie wiem w czym jest błąd. Prosiłbym o pomoc. Dodałem instrukcje printf() i getch() do lepszego wglądu na przebieg rekurencji. Nie są potrzebne.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>


int oblicz(int tab[], int n)
{
    if(n==0)
    {
        printf("Doszlo do 1\n");
        return 1;
    }

    else
    {
        printf("Tab[%d]= \n", n,tab[n]);getch();
        return tab[n]=oblicz(tab, n-1)+pow(-1,n)*1/n;
    }

}

int main()
{
    int n;
    int i;
    printf("Podaj n: "); scanf("%d",&n);
    int *tab;
    tab = (int*)malloc(n*sizeof(int));

    oblicz(tab,n-1);

    for(i=0;i<n;i++)
        printf("%d, ",tab[i]);
    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 25 października 2017 przez Bondrusiek Maniak (61,370 p.)
wybrane 31 października 2017 przez Ditrix
 
Najlepsza

Witam,

debuguj sobie projekt i zobaczysz co przechowują zmienne.

BTW

Użyj funkcji free() dla wskaźnika tab aby zwolnić pamięć.

free(tab)

Kolejną rzeczą jest co ty chcesz dodać do tej tablicy. Funkcja zwraca int a ty dopisujesz do zwracanej wartość pow(-1,n) oraz 1/n a typ int urywa część ułamkową. Jeśli dobrze liczę to zakres tego wyrażenia pow(-1,n)*1/n to <-1;1>.

0 głosów
odpowiedź 24 października 2017 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
Nie do końca rozumiem problemu. Możesz debugować projekt linijka po linijce. Możesz w tedy się zastanowić gdzie konkretnie zrobiłeś błąd, a my pomożemy ci rozwiązać, poprawnie napisać. Może masz wartość śmieciową tym narzędziem ją znajdziesz.

Po za tym zawsze dawaj printf, abyś już bez debugowania wiedział gdzie masz błąd.
komentarz 24 października 2017 przez Ditrix Mądrala (5,650 p.)
Problem polega na tym, iz rekurencyjnie po spełnieniu warunku n==0, powinny się po kolei wykonywać działania przypisujące odpowiedni wynik do odpowiedniego indeksu tablicy.
komentarz 24 października 2017 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
Możliwe że właśnie w n tam masz śmiecia, warunek jest dobrze zapisany. printf go zanim masz warunek.

Jakbym pamiętał (umiał) lokować w ten sposób tablicę, powiedział bym ci więcej, możliwe również, że n w ogóle nie został tam przekazany.
komentarz 24 października 2017 przez Ditrix Mądrala (5,650 p.)
Jak sprawdzam wywołania programu, to gdy warunek n==0 spełnia się, funkcja w całości zwraca 1, kończąc pętlę rekurencyjną.
komentarz 24 października 2017 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
no tak, o dziwo twój problem jest rozwiązaniem mojego...

No tak tamten warunek zwróci 1, i tam gdzie wywoływałeś oblicz w main masz postawioną momentalnie zwykłą 1;

Czyli jeśli twój n=0 to wskakuje do funkcji która ma if(n==0) spełnia się i przerywasz z wywołaniem wartości logicznej prawda.

Pewnie chcesz zwrócić to co masz w else. Zwrócisz to jeśli n nie będzie 0.
komentarz 24 października 2017 przez Mateusz Analityk Stary wyjadacz (13,710 p.)

Tutaj masz jakiś błąd reszta jest dobrze.

printf("Tab[%d]= \n", n,tab[n]);getch();
        return tab[n]=oblicz(tab, n-1)+pow(-1,n)*1/n;

 

komentarz 24 października 2017 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
powinieneś mieć tam 2x jakiś % bo wpisałeś po przecinku 2 zmienne w printf
komentarz 24 października 2017 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
po za tym kompilator tam mi nie rozumie jeszcze jakiegoś pow
komentarz 25 października 2017 przez Ditrix Mądrala (5,650 p.)
Takie luźne pytanie. Wiesz na czym polega rekurencja ?
komentarz 25 października 2017 przez Mateusz Analityk Stary wyjadacz (13,710 p.)
Na zwróceniu wywołanej funkcji... przez siebie powiedzmy kilka razy.

Dobra nie pomogę. ale w 17 masz błąd z % dla drukowanej tablicy też dajesz.

Podobne pytania

0 głosów
3 odpowiedzi 1,005 wizyt
pytanie zadane 27 lutego 2018 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
0 odpowiedzi 921 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez Tomek Wilnowski Użytkownik (610 p.)
0 głosów
1 odpowiedź 1,927 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez AndekQR Użytkownik (880 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...