如何在Java中使用递归获取goldenRatio?

pro*_*ogx 5 java recursion

我正在研究这个简单的java递归问题,给出以下指示:

  • 计算黄金比例.

  • 给定两个数字a和b,其中a> b> 0,比率为b/a.

我已经完成了一些代码,但我仍然坚持让递归正常工作.这是我的代码:

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

}
Run Code Online (Sandbox Code Playgroud)

Ass*_*saf 5

这样的事情怎么样:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以在一个函数中实现所需,而epsilon决定分辨率的精确度.

另外作为一个额外的好处,虽然Java没有(至少在编写这个时)尾递归优化,但理论上这个函数可以通过尾递归来优化.

硬编码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);
    }
}
Run Code Online (Sandbox Code Playgroud)

示例运行:

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
}
Run Code Online (Sandbox Code Playgroud)