PDA

Visualizza la versione completa : Calcolo potenza di un numero con metodo ricorsivo


devil89
01-05-2006, 11:48
Ciao a tutti. Sto cercando di imparare cos'è la ricorsione e vorrei saperla utilizzare bene.

Sto cercando di fare un esempio di programma che calcola in modo ricorsivo tramite una funzione, la potenza, cioè pow (base, esponente).

Ho provato così, ma:
- in compilazione mi da un warning che non capisco ("[Warning] conflicting types for built-in function 'pow' )

- l'esecuzione parte lo stesso ma come risultato mi da sempre 0;



#include <stdio.h>


/*
IP Base
IP Esponente
OR pow
*/

int pow (int base, int esponente) {
if (esponente==1)
return base;
else
return base*pow(base,esponente-1);
} /* pow */


int leggi (int base, int esp) {
printf ("Base: "); scanf ("%d", &base);
printf ("Esponente: "); scanf ("%d", &esp);
} /* leggi */

int main () {
int base, esp;
leggi (base,esp);
printf ("%d", pow (base, esp));
system ("pause");
} /* main */


Uso Dev-C++ come IDE.

devil89
01-05-2006, 12:56
L'ho modificato così:


int potenza (int base, int esponente) {
if (esponente<0)
return 0;
else if (esponente==0)
return 1;
else if (esponente>0)
return base*potenza(base,esponente-1);
} /* potenza */


Ora non mi da nessun warning ma in esecuzione ottengo sempre 0.

Qualcuno può aiutarmi? :bhò:

XWolverineX
01-05-2006, 13:43
Dunque, il warning ti era dato poichè pow è una funzione della libreria standard (contenuta nel file math.h) e tu ne stavi facendo l'overloading, cosa abbastanza rara per una funzione standard.
Chiamando la funzionie in un altro modo, il problema non arriva.

SeTThino
01-05-2006, 13:50
L'errore sta nel fatto che nella funzione leggi (int base, int esp), base ed esp vengono passati per valore quindi le modifiche fatte non influenzano base ed esp contenute in main(), per risolvere ti basta mettere:


printf ("Base: "); scanf ("%d", &base);
printf ("Esponente: "); scanf ("%d", &esp);

all'interno di main().

devil89
01-05-2006, 13:59
Non funziona comunque.

Altri suggerimenti?

king64
01-05-2006, 14:04
Così funziona :


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

int pot(int base,int esp)
{
if (esp==0)
return 1;
else
return base*pot(base,esp-1);
}

int main()
{
int base, esp;
printf ("Base: "); scanf ("%d",&base);
printf ("Esponente: "); scanf ("%d",&esp);
printf ("%d\n",pot(base,esp));
system ("pause");
return 0;
}

:ciauz:

devil89
01-05-2006, 15:22
Originariamente inviato da king64
Così funziona :


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

int pot(int base,int esp)
{
if (esp==0)
return 1;
else
return base*pot(base,esp-1);
}

int main()
{
int base, esp;
printf ("Base: "); scanf ("%d",&base);
printf ("Esponente: "); scanf ("%d",&esp);
printf ("%d\n",pot(base,esp));
system ("pause");
return 0;
}

:ciauz:

Grazie mille.
Potresti dirmi cosa cambia dalla mia seconda versione che ho postato?
Non vedo tante differenze...
Forse nel fatto che leggevo i valori di base e esponente con una funzione che passava per valore i parametri?

king64
01-05-2006, 16:40
Ho inserito all'interno del main la lettura devi valori della base e dell'esponente , come anche indicato da SeTThino , e poi ho modificato la condizione limite di uscita all'interno della funzione . Saluti :ciauz:

Loading