Zadanie z rekurencji

0

Potrzebowałbym pomocy z tym zadaniem, nie do końca wiem jak napisać tą funkcję. Jakby ktoś mógł troszkę pomóc byłbym wdzięczny :)
Napisz rekurencyjną funkcję o wartościach rzeczywistych PowerN ( X , N ), która zwraca moc X^N ( X ≠ 0 jest liczbą rzeczywistą, N jest liczbą całkowitą) obliczoną w następujący sposób:

X ^0 = 1,
X^N = ( X^N div 2 )^2 jeśli N jest dodatnią liczbą parzystą, X^N = X · X^N -1, jeśli N jest dodatnią liczbą nieparzystą, X^N = 1/X^ - N jeśli N <0,

gdzie "div" oznacza operatora podziału całkowitego . Za pomocą tej funkcji moce wyjściowe X^N dla danej liczby rzeczywistej X i pięć podane liczby całkowite N .

0

Co to znaczy zwraca "moc X^N"? Po prostu, X do potęgi N? Jak, X=2 i N=2, to zwraca 4?

0

Jak troszeczkę pomóc, to są algorytmy, jak nie Rozumiesz, to Przeanalizuj je z kartką, daję jeszcze potęgowanie z Wikipedii, dla porównania, nie wiem co z tym div, bo zwykłe / z C działa:

double PowerN(double x, int n){
	if (n < 0) return PowerN(1 / x, -n);
	else if (n == 0) return 1;
	else if (n == 1) return x;
	else if (n % 2 == 0) return PowerN(x , n / 2) * PowerN(x , n / 2);
	else return x * PowerN(x, (n - 1));
}

double PowerNWiki(double x, int n){
	if (n < 0) return PowerN(1 / x, -n);
	else if (n == 0) return 1;
	else if (n == 1) return x;
	else if (n % 2 == 0) return PowerN(x * x , n / 2);
	else return x * PowerN(x * x, (n - 1) / 2);
}
0

Miałem bardzo podobny kod tylko wyskakiwał mi błąd typu QNAN0 i jakoś nie umiałem tego przekształcić żeby działało.

Co do poleceń niestety każde, które dostajemy do zrobienia są dość skomplikowanie napisane.
Dzięki za pomoc z resztą sobie poradzę :)

0

Coś popsułem chyba, nie wiem dlaczego te błędy wyskakują jak nie ma tablic też wyskakuje

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

double PowerN(double x, int n){
  if (n < 0) return PowerN(1 / x, -n);
  else if (n == 1) return x;
  else if (n % 2 == 0) return PowerN(x , n / 2) * PowerN(x , n / 2);
  else return x * PowerN(x, (n - 1));

int main()
{   int n[5];
    double x;
    printf("Podaj X = ",x);
    scanf("%d",&x);
    for(int i = 0; i < 5; i++)
    {
        printf("Podaj N = [%i]",i);
        scanf("%i",&n[i]);
    }
    printf("%f^%d = %f",x,n,PowerN(x,n));
    return 0;
}
1

Ostrzeżenie kompilatora mówi Ci wprost w czym jest problem: Masz funkcję przyjmującą int:

double PowerN(double x, int n)

natomiast Ty wrzucasz do niej całą tablicę n[5] (oczywiście tak naprawdę wrzucasz wskaźnik na pierwszy element):

    int n[5];
    ...
    printf("%f^%d = %f",x,n,PowerN(x,n));

edit: Widzę u Ciebie w kodzie, że w samej funkcji dekrementujesz wrzucane n, więc może chciałeś wrzucić liczbę elementów tej tablicy? Nie wiem, ale jeśli zgadłem to proponuję zrobić to tak:

#define POWER 5

double PowerN(double x, int n){
  if (n < 0) return PowerN(1 / x, -n);
  else if (n == 1) return x;
  else if (n % 2 == 0) return PowerN(x , n / 2) * PowerN(x , n / 2);
  else return x * PowerN(x, (n - 1));
 
int main()
{   int n[POWER];
    double x;
    printf("Podaj X = ",x);
    scanf("%d",&x);
    for(int i = 0; i < 5; i++)
    {
        printf("Podaj N = [%i]",i);
        scanf("%i",&n[i]);
    }
    printf("%f^%d = %f",x,n,PowerN(x,POWER));
    return 0;
}

edit2: Chociaż teraz widzę, że próbujesz tak naprawdę przesuwać się po tablicy, skoro robisz n - 1. Nie wiem tylko czy Twoje n miało być poprzednim elementem, czy tylko indeksem.
Jeśli indeksem, to mój poprzedni edit powinien być OK.
Jeśli elementem, to musisz przekazać do swojej funkcji (i funkcja musi przyjmować) wskaźnik na tablicę, nie int.

0

Już jest lepiej tylko teraz ma problem

scanf("%d",&x);

a później z tym

printf("%f^%d = %f",x,n,PowerN(x,POWER));

Ja wiem, że to proste rzeczy ale nie umiem tego do końca ogarnąć, rozumiem działanie funkcji tylko te błędy nie wiem z czego się biorą.

0

Chodzi o to, że ja musze 5 N podać, które są wykładnikami tego X tylko właśnie wyskakują błędy z wskaźnikami a ja nie do końca to rozumiem :/

0

5 N podać, które są wykładnikami tego X

w porządku, teraz rozumiem. Oznacza to, że masz tablicę pięciu wykładników: int exponents[NUMBER_OF_EXPONENTS] = {0}, którą po uzupełnieniu przekazujesz do funkcji.
Jednak Twoja funkcja musi przyjmować już nie jeden wykładnik int n (jak masz w kodzie obecnie), a musi przyjmować tablicę int* exponents:

double PowerX(double x, int* exponents);

Wtedy możesz śmiało wrzucać całą tablicę, po której możesz się poruszać znając jej rozmiar.
Rozmiar tablicy możesz znać na podstawie globalnie zdefiniowanej stałej, na przykład #define NUMBER_OF_EXPONENTS 10, lub przekazywać rozmiar tablicy jako dodatkowy parametr funkcji:

double PowerX(double x, int* exponents, const int numberOfExponents);

edit: Zmieniłem jednak nazwę funkcji z PowerN na PowerX. Nowa nazwa lepiej określa, który parametr jest potęgowany.

0

Teraz każde N muszę zrobić jak wskaznik ??

#define NUMBER_OF_EXPONENTS 5
#include <stdio.h>

double PowerX(double x, int* n){
  if (n < 0) return PowerX(1 / x, -n);
  else if (n == 1) return x;
  else if (n % 2 == 0) return PowerX(x , n / 2) * PowerX(x , n / 2);
  else return x * PowerX(x, (*n - 1));

int main()
{   int n[NUMBER_OF_EXPONENTS] = {5};
    double x;
    printf("Podaj X = ",x);
    scanf("%d",&x);
    for(int i = 0; i < 5; i++)
    {
        printf("Podaj N = [%i]",i);
        scanf("%i",&n[i]);
    }
    printf("%f^%d = %f",x,n,PowerX(x,NUMBER_OF_EXPONENTS));
    return 0;
}
0

Chyba będę musiał więcej takich zadań zrobić bo mam duzy roblem z tym.

1

Duży problem masz tak naprawdę z podejściem do zadania. Obecnie przekopiowujesz wszystkie nasze porady i zaczynasz się gubić, robi się chaotycznie.
Obecnie masz sporo głupot w kodzie, które nie wynikają z Twoich braków wiedzy, ale z Twojego chaotycznego podejścia:
Co to jest -n?

if (n < 0) return PowerX(1 / x, -n);

Przekazujesz wskaźnik, ale potem traktujesz go jak zwykłą liczbę

  else if (n % 2 == 0) return PowerX(x , n / 2) * PowerX(x , n / 2);

by potem jednak zrobić wyłuskanie

  else return x * PowerX(x, (*n - 1));

Zastanowiłeś się, dlaczego wstawiasz surową liczbę 5, mimo, że to samo masz zdefiniowane jako stała?

{   int n[NUMBER_OF_EXPONENTS] = {5};
    ...
    for(int i = 0; i < 5; i++)

W jakim celu wstawiasz = {5}?

Spokojnie. ;)
Przeczytaj sobie cały wątek, prześledź swój kod krok po kroku, porównaj z ostrzeżeniami jakie generuje Ci kompilator, zastanów się nad tym, co chcesz naprawdę uzyskać.

0

Te -n mam podane w poleceniu zadania.
Ciągle wyskakują błędy typu "expected int* but argument is of type int.
Już się pogubiłem.

0

W końcu działa :DD

#include <stdio.h>
 
#define NUMBER_OF_EXPONENTS 5
double PowerN(double x, int n){
    if(n == 0) return 1;
    if(n == 1) return x;
    if(n < 0) return PowerN(1 / x, -n);
    else{
            if (n % 2 == 0) return ( PowerN(x , n / 2) * PowerN(x , n / 2) );
            else return ( x * PowerN(x, (n - 1)));
    }
}
 
int main()
{   int n[NUMBER_OF_EXPONENTS];
    double x;
    printf("Podaj X = ");
    scanf("%lf",&x);
    for(int i = 0; i < NUMBER_OF_EXPONENTS; i++)
    {
        printf("Podaj N[%i] = ",i+1);
        scanf("%i",&n[i]);
    }
    printf("\n");
    for(int i = 0; i < NUMBER_OF_EXPONENTS; i++) printf("PowerN(X, N%d) = %e\n",i+1,PowerN(x,n[i]));
    return 0;
}

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