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

C rekurencja

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
3,833 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,440 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,280 wizyt
pytanie zadane 27 lutego 2018 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
0 odpowiedzi 1,051 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez Tomek Wilnowski Użytkownik (610 p.)
0 głosów
1 odpowiedź 1,978 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez AndekQR Użytkownik (880 p.)

93,103 zapytań

142,077 odpowiedzi

321,562 komentarzy

62,445 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

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!

...