Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] Potenza ricorsiva

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    13

    [C] Potenza ricorsiva

    Ciao,
    non capisco perchè mi va in overflow questo codice, semplicemente vorrei calcolare la potenza in modo ricorsivo.

    codice:
    #include <stdio.h>
    
    double potenzaRicors(float base, float esp, int i, double res); 
    
    int main() {
    	double res;
    	float base, esp;
    	int i = 1;
    	printf("Digita la potenza (es. 5^2): ");
    	scanf("%d^%d", &base, &esp);
    	res=base;
    
    	printf("\n\nRisultato: %d", potenzaRicors(base, esp, i, res));
    	getchar();
    }
    
    double potenzaRicors(float base, float esp, int i, double res) {
    	if (i == esp) {
    		return res*base;
    	} else {
    		res = base * res;
    		potenzaRicors(base, esp, i+1, res);
    	}
    }

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Perché non c'è l' istruzione return nell' else e perché stai aumentando incrementando i invece di decrementarlo.
    Ma ci sono altre cose da dire: la funzione potenza la puoi fare con due parametri: base ed esponente.Non capisco perché usi res e i.

    EDIT:
    Permettimi una correzione:

    codice:
    double potenzaRicors(float base, float esp)
    {
    	if (esp == 1) 
            {
    		return base;
    	} 
            else 
            {
    		return base * potenzaRicors(base, esp-1);
    	}
    }

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Who però la sua è tail recursive mentre la tua no, comunque un argomento lo può togliere comunque: int i.

    P.s. a discapito della velocità/memoria io preferisco comunque l'implementazione di Who, ma non è affatto consigliabile in un codice reale...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    13
    Originariamente inviato da Scara95
    Who però la sua è tail recursive mentre la tua no, comunque un argomento lo può togliere comunque: int i.

    P.s. a discapito della velocità/memoria io preferisco comunque l'implementazione di Who, ma non è affatto consigliabile in un codice reale...
    No beh chiaro che la sua implementazione non sia consigliata, basta usare pow()...
    Comunque il fatto è che con le tail ci capisco poco, con le non tail non ci capisco proprio niente e sto cercando di fare qualche esercizietto facile per imparare a gestirle...
    Grazie intanto!

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Penso che tu non abbia chiaro il concetto di tail recursive...
    E comunque sono più semplici quelle non tail.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Hai ragione, per potenze molto elevate lo stack si riempie inutilmente di variabili.
    Ecco qua un' altra implementazione:

    codice:
    double _power(double value,double base, int exp)
    {
        if(exp<0)
            return _power(1.0/base*value,base,exp+1);
        else if(exp>0)
            return _power(base*value,base,exp-1);
        else
            return value;
    }
    
    double power(double base, int exp)
    {
        return _power(1.0,base,exp);
    }

  7. #7
    Who, nel codice originario l'esponente era float, questo ha senso quando l'esponente è una frazione perché c'é da calcolare la radice.
    Nella sua implementazione però l'esponente viene confrontato con un intero, e qui bisogna capire cosa richiederebbe l'esercizio.
    ...

  8. #8
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Lo so, ci avevo pensato a questo.
    Ho intuito che l' esponente doveva essere un int dal fatto che il suo codice (quello corretto) andava in stack overflow se si tentava di calcolare valori come 2^2.5 (e mi pareva un' ovvietà).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.