View Full Version : Funzione matematica ricorsiva in C
Salve a tutti dovrei trasformare una funzione matematica in una funzione ricorsiva in C la funzione è la seguente:
f(x)= x^2/f((x+1)/x)
ed ecco il codice che ho scritto:
float divisione (float x) {
if (x==0)
return 0;
else
return x^2/divisione((x+1)/x);
}
sono quasi sicuro che vi siano degli errori visto che non compila
wizard_at
18-03-2016, 19:27
anche se compilasse direi che comunque non puo' funzionare scritta cosi'!
f(x) = 0 non e' possibile. Ti darebbe divisione per zero.
Inoltre direi che non arriverai mai a chiamare f(0). Se questo accade o x = -1 o sei andato in overflow o casini simili
in C non esiste l'operatore ^, se vuoi fare elevamento a potenza o ti crei la tua funzione oppure usi le funzioni pow() da math.h
In realtà esiste, solo che non fa quello che pensa lui.
L'operatore "^" è l'operatore bitwise per fare un OR esclusivo tra bit (XOR).
ok quindi:
float divisione (float x) {
if (x>0)
return 0;
else
return pow(x,2)/divisione((x+1)/x);
}
dovrebbe essere così giusto?
Per l'overflow lo credo anch'io, solo che la traccia presenta questa funzione, quindi mi chiedo se sintatticamente la funzione sia corretta
cdimauro
23-03-2016, 20:34
in C non esiste l'operatore ^, se vuoi fare elevamento a potenza o ti crei la tua funzione oppure usi le funzioni pow() da math.h
In questo caso penso sia sufficiente ricorrere al classico x * x.
Comunque deve prima definire, per convenzione, quanto valga f per x = 0.
In questo caso penso sia sufficiente ricorrere al classico x * x.
Comunque deve prima definire, per convenzione, quanto valga f per x = 0.
Forse è troppo presto e quindi sono rincretinito, ma nel primissimo esempio aveva definito:
f(0) = 0
cdimauro
24-03-2016, 07:15
Il problema è formale: la formula che ha esposto all'inizio non contiene nessuna indicazione nel caso in cui x sia uguale a 0.
Lo fa nella sua implementazione, che non necessariamente rispetta la suddetta formula: quella di restituire 0 quando x vale 0 è soltanto una sua, personalissima, decisione. Restituire 1, ad esempio, potrebbe essere ugualmente corretto.
Per questo parlavo di convenzione prima.
P.S. Se la formula arrivasse da un compito, il docente avrebbe dovuto specificare anche questo caso.
Il problema è formale: la formula che ha esposto all'inizio non contiene nessuna indicazione nel caso in cui x sia uguale a 0.
Lo fa nella sua implementazione, che non necessariamente rispetta la suddetta formula: quella di restituire 0 quando x vale 0 è soltanto una sua, personalissima, decisione. Restituire 1, ad esempio, potrebbe essere ugualmente corretto.
Per questo parlavo di convenzione prima.
P.S. Se la formula arrivasse da un compito, il docente avrebbe dovuto specificare anche questo caso.
Ah beh sì, nella formula matematica iniziale, effettivamente, non è chiarito questo caso.
Forse farebbe prima a farci leggere il testo dell'esercizio, qualora si trattasse di ciò.
il problema e' che se davvero fosse f(0) = 0 da specifica, la funzione e' una forma indeterminata per ogni valore possibile dell'ingresso. per questo bisogna postare la traccia originale.
Ma anche se f(0) fosse diverso da 0, no?
Cioè, qual è la "condizione di uscita" di questa funzione ricorsiva? :confused:
se fosse f(0) diverso da zero, sarebbe computabile su questo dominio [0,-inf)
e.g.
con f(0) = 1, volendo calcolare f(-1) = ((-1).^2) / (1)
la condizione di uscita e' proprio f(0) = 1, e si incontra ogni qualvolta calcoli il valroe della funzione per x < 0.
se invece x > 0, non esci mai dalla ricorsione.
Ecco, pensavo proprio al caso x > 0.
Comunque, avere ulteriori dettagli sarebbe meglio.
Ah, il dominio è (-inf ; 0] :p
cdimauro
24-03-2016, 14:16
se fosse f(0) diverso da zero, sarebbe computabile su questo dominio [0,-inf)
e.g.
con f(0) = 1, volendo calcolare f(-1) = ((-1).^2) / (1)
la condizione di uscita e' proprio f(0) = 1, e si incontra ogni qualvolta calcoli il valroe della funzione per x < 0.
se invece x > 0, non esci mai dalla ricorsione.
Questo a livello matematico, ma se usi un float il dominio non è più R, ma un sottoinsieme stretto di Q.
La problematica, però, rimane interessante: considerato il range limitato dei float e gli errori di approssimazione nei calcoli, chissà quali risultati verrebbero prodotti per qualunque insieme di 2^32 (meno alcuni valori speciali dello standard IEEE) valori utilizzabili come input di questa funzione.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.