PDA

View Full Version : Funzione matematica ricorsiva in C


nasio91
18-03-2016, 14:20
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

WarDuck
19-03-2016, 09:24
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).

nasio91
19-03-2016, 16:10
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.

GTKM
24-03-2016, 06:48
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.

GTKM
24-03-2016, 12:30
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ò.

GTKM
24-03-2016, 13:22
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:

GTKM
24-03-2016, 14:03
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.