Prośba o sprawdzenie wyniku

0

Witam, mam do zrobienia w szkole następujące zadanie

screenshot-20201021104237.png

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

int n,m;
double ciag(double n)
{
    if(n<=0)
        return 1;
    else
        return ciag(n-1)+pow(-1,n)*1/n;
}

int main()
{
    double ciag();

    printf("Wprowadz n: \n");
    scanf("%d", &n);

    printf("Wprowadz m: \n");
    scanf("%d", &m);


    while(n<=m)
    {
        printf("%d wyraz ciagu wynosi :%lf \n", n, ciag (n));
        printf("Roznica wynosi: %f \n", ciag(n)-ciag(n-1));
        printf("\n");

        n++;

    }
    return 0;
}

screenshot-20201021104616.png

Czy powinienem otrzymać następujący wynik ?

1

Sformatuj i zamieść ten kod po ludzku. Zaznaczasz kod, na toolbarze strzałeczką wybierasz język C

Kilka szczegółów formalnych:

#include <conio.h>  <-- to jest niestandardowe i staraj się nie używać

 int n,m;  <- tym, zmiennym o wiele lepiej będzie w main. Globalne to zło
int main()
{
     double ciag();   <- jak już powtarzasz deklarację, to pełną double ciag(double n)
 
     int ile = scanf("%d", &n); <-- warto sprawdzać ile danych się przetworzyło w scanf, ma być jeden

Czyli proponowany początek main() by wyglądał tak:

int main()
{
     int n,m;  
     double ciag(double n);  // ze względu na obecność pełnej funkcji powyżej, deklaracja jest zbędna, ale zamieściłem jako poprawka twojej


.

Czy powinienem otrzymać następujący wynik ?

Kalkulatorek w ręce, długopis, pierwsze 5 wyników nie zdrętwieją palce.

3

Czemu ciag (double n)skoro n to liczba naturalna? Czemu warunek stopu jest taki: if (n <= 0), podczas gdy x0 = 1?

0

Czy powinienem otrzymać następujący wynik ?

Co do matematycznych kwestii to ci raczej nie pomogę. Musisz sam wziąć kartkę i obliczyć.

Oprócz powyższych uwag dodałbym jeszcze:

    while(n<=m)
    {
        printf("%d wyraz ciagu wynosi :%lf \n", n, ciag (n));
        printf("Roznica wynosi: %f \n", ciag(n)-ciag(n-1));
        printf("\n");

W linii 25 i 26 wywołujesz kilka razy tą samą funkcję wiedząc, że wcześniej wykonała już swoje obliczenia. Poprzedni wynik możesz przechować w osobnej zmiennej. Zaoszczędzisz wówczas czas.
np:

double curr = 0;
double prev = ciag(n-1);
while(n<=m)
{
        curr = ciag(n);
        printf("%d wyraz ciagu wynosi :%lf \n", n,curr );
        printf("Roznica wynosi: %f \n", curr -prev;
        printf("\n");
        prev = curr;

Można to jeszcze lepiej zrobić, wiadomo, ale to tylko przykład.

0

@Czitels: Ale to już nie jest rekurencja.

1

Obliczenia rekurencyjne występują tylko w funkcji "ciąg" i tam nic nie jest modyfikowane.
W pętli while jedynie wywołujemy tą metodę i pracujemy na zwróconych wynikach. Skoro taki wynik obliczyliśmy już wcześniej to po co mamy robić to ponownie? Nie można tego przechować i wówczas zoptymalizować?

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