Funkcja obliczająca rekurencyjnie potęgę liczby

0

Napisz funkcję double potega(double podstawa, int wykladnik)
Napisałem ten program ale nie działał wiec poszukalem troche w internecie i dowiedziałem się, że musze w linijce z else return od m odjąć 1 dlaczego?

#include <stdio.h>
double potega(double n, int m)
{
    if (m == 0)
        return 1;
    else
        return n * potega(n, m - 1);
}
int main()
{
    double n, m;
    scanf("%lf", &n);
    scanf("%lf", &m);
    printf("%lf", potega(n, m));
    return 0;
}

 
0

Zastanów się przez chwilkę. Bez tego -1 Twój zapis oznacza, że ab = a * ab. Czy to jest prawdziwe? (pomijając a = 1)

1

Dlatego, że parametr m jest licznikiem wywołań rekurencyjnych; Gdybyś przekazywał cały czas niezmieniony parametr m do wywołań rekurencyjnych - zapętliłbyś wywołania, aż do przepełnienia stosu.

3

Powinno być tak:

#include <stdio.h>
double potega(double n, unsigned m)
  {
   return m?(m&1?n:1)*potega(n*n,m>>1):1;
  }
  
int main()
  {
   double n;
   unsigned m;
   scanf("%lf%u",&n,&m);
   printf("%lf",potega(n,m));
   return 0;
  }