我正在按照以下说明解决这个简单的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;
    }
    
    }
    

    最佳答案

    这样的事情怎么样:

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

    这样,您就可以在一个功能中实现所需的功能,而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);
        }
    }
    

    示例运行:
    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
    }
    

    09-30 18:09
    查看更多