2016-01-26 9 views
5

sto lavorando su questo semplice problema java ricorsione dato i seguenti direzioni:Come ottenere goldenRatio utilizzando la ricorsione in Java?

  • calcolare il rapporto aureo.

  • Dato due numeri aeb con a> b> 0, il rapporto è b/a.

Ho fatto qualche codice ma sono bloccato a far funzionare correttamente la ricorsione. Qui è il mio codice:

public class MyTesting { 

public static void main(String[] args) { 
    System.out.println(ratio(8 , 4)); 
} 

public static double ratio(int a, int b) { 

    int goldelRatio = 0; 
    if(a > b && b > 0){ 
     return goldelRatio = a/b; 
    } 

    return goldelRatio; 
} 

} 
+0

ha appena aggiornato il titolo. – progx

+2

Ti manca la parte di ricorsione. Devi chiamare il rapporto dall'interno del rapporto per avere ricorsione. – matt

+0

@matt si ma come sarebbe implementato ?. Sono un po 'bloccato sul rapporto di ritorno – progx

risposta

5

Che ne dite di qualcosa di simile:

double goldenRatio(double a, double b, double epsilon) { 
    if(Math.abs((b/a) - ((a + b)/b)) < epsilon) { 
     return ((a + b)/b); 
    } else { 
     return goldenRatio(b, a + b, epsilon); 
    } 
} 

questo modo a raggiungere ciò che è necessario in una funzione, con epsilon decidere come bene la risoluzione sarebbe.

Anche come bonus aggiuntivo, e sebbene Java non abbia (al momento della stesura di questo almeno) ottimizzazione della ricorsione di coda, in teoria questa funzione potrebbe essere ottimizzata mediante ricorsione a coda.

esempio con epsilon codificato duro:

double goldenRatio(double a, double b) { 
    double epsilon = 0.00001; 
    if(Math.abs((b/a) - ((a + b)/b)) < epsilon) { 
     return ((a + b)/b); 
    } else { 
     return goldenRatio(b, a + b); 
    } 
} 

esempio eseguire:

public static void main(String[] args) { 
    double goldenRation1 = goldenRatio(1.0, 1.0); 
    System.out.println(goldenRation1); // prints 1.618032786885246 
    System.out.println(goldenRation1 > 1.61800 && goldenRation1 < 1.61806); // prints true 

    double goldenRation2 = goldenRatio(100.0, 6.0); 
    System.out.println(goldenRation2); // prints 1.6180367504835589 
    System.out.println(goldenRation2 > 1.61800 && goldenRation2 < 1.61806); // prints true 
} 
+0

Ma voglio solo passare 2 parametri attraverso il metodo NOT 3 parametri ... – progx

+0

quindi potresti codice rigido epsilon. Modificherò per mostrare un esempio. In generale, tutti i metodi di ricorsione devono avere una condizione di stop, avvizzire hard coded o forniti in uso.Altrimenti andrebbero d'accordo e probabilmente otterresti un 'StackOverflow' * wink * – Assaf

+0

Sto testando la tua risposta ma non funziona quando la eseguo usando il mio metodo di test – progx

1

ricorsione significa principalmente metodi chiamando themself, il che significa che dovrebbe provare qualcosa di simile:

public double recursionMethod(int a, int b){ 
    int c = a+b; 
    if(Math.abs(ratio(b,a)-ratio(c,b))< (double) 1/42) 
     return ratio(c,b); 
    else 
     return recursionMethod(b,c); 
} 

1/42 è proprio la precisione, è possibile implementare qualsiasi altra condizione di rottura che ti piace . Chiamare questo metodo in main con argomenti (1,1).

+0

Ma non voglio avere 2 metodi come ratio e ricorsionMethod. Come possiamo implementare questi 2 metodi in un solo metodo e poi chiamarlo da main? – progx

+0

Quindi implementare il metodo di rapporto in questo, poiché restituisce (double) solo a/b con un test di argomenti appropriati. (oh, potresti voler cambiare goldelRatio per raddoppiare e fare questo cast. Altrimenti otterrai solo 1 o 0 ...) – ctst

2

vostro non è una funzione ricorsiva, una funzione ricorsiva che calcola Golden Ratio sarebbe simile alla seguente.

private int MAX_COUNTER = 50; 
private int count = 0; 

public double ratio(double a, double b) { 

    count++; 

    double goldenRatio = b/a; 

    if (count < MAX_COUNTER) { 
     return ratio(b, a + b); 
    } 

    return goldenRatio; 
} 

NOTA: ho messo i contatori perché dato che è una funzione ricorsiva cercando di trovare un numero con decimali infiniti, causerà la JVM di andare avanti StackOverflow :), quindi siamo riusciti a fermarlo prima o poi .

+0

Non penso che dovresti usare il numero di iterazioni come condizione di stop. Visto che questo è davvero un numero decimale di solito ti piacerebbe raggiungere una certa precisione come la condizione di arresto IMO. – Assaf

+0

Assaf, sezione aurea non è solo un numero decimale, è un limite, o meglio, è il limite del numero di numeri consecutivi di Fibonacci, quindi non è possibile trovare tutti i numeri decimali, vi invito a leggere questo link wikipedia per capire meglio quale sia il rapporto aureo: https://en.wikipedia.org/wiki/Golden_ratio –

+0

L'implementazione corretta sarebbe quella che si adatta meglio ai requisiti. Come puoi vedere dal metodo di test dell'OP, aveva bisogno che la risposta fosse corretta fino al 5 ° decimale. Puoi dire quante iterazioni occorrerebbe per ottenere ciò? Usando il numero di iterazioni probabilmente dovresti fare troppe iterazioni o non abbastanza. – Assaf

Problemi correlati