Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the goldenRatio using recursion in Java?

Tags:

java

recursion

I'm working on this simple java recursion problem given the following directions:

  • Calculate the golden ratio.

  • Given two numbers a and b with a > b > 0, the ratio is b / a.

I have done some code but I'm stuck on getting the recursion working properly. Here's my code:

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;
}

}
like image 933
Devmix Avatar asked Jan 26 '16 09:01

Devmix


People also ask

Is the golden ratio recursive?

The phi() function is recursive. Its two arguments are double p , and int precision . The precision argument determines how many times the function recurses, which also plays into the accuracy of the value returned.


1 Answers

How about something like this:

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);
    }
}

This way you achieve what you need in one function, with epsilon deciding how fine the resolution would be.

Also as an added bonus, and although Java doesn't have (at the time of writing this at least) tail recursion optimization, in theory this function could be optimized by tail recursion.

example with hard coded epsilon:

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);
    }
}

example run:

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
}
like image 64
Assaf Avatar answered Sep 26 '22 05:09

Assaf