首页 > 解决方案 > 如何在特定情况下将while循环转换为递归方法

问题描述

我需要帮助将此 while 循环方法转换为递归方法

public static int diaseneliminar(double cantidamedicina, double porcentajeaeliminar){
    double basedivisorporcentaje = 100;
    double cantidadmedicinarestante = cantidamedicina*(1-(porcentajeaeliminar/basedivisorporcentaje));
    int contadordia=0;
    while(cantidamedicina>cantidadmedicinarestante){
        cantidamedicina = cantidamedicina - (cantidamedicina * 0.2);
        contadordia++;
        System.out.println("cantidamedicina:"+cantidamedicina+"cantidadmedicinarestante:"+cantidadmedicinarestante+"contadordia:"+contadordia);
    }
    return  contadordia;
}

提前致谢

标签: javarecursionwhile-loop

解决方案


只需将其拆分为初始化和递归,将 while-criteria 否定为 return-criteria:

public static int diaseneliminarRecursive(double cantidamedicina, double porcentajeaeliminar){
    double basedivisorporcentaje = 100;
    double cantidadmedicinarestante = cantidamedicina*(1-(porcentajeaeliminar/basedivisorporcentaje));
    return recursion(0, cantidamedicina, cantidadmedicinarestante);
}

private static int recursion(int contadordia, double cantidamedicina, double cantidadmedicinarestante) {
    System.out.println("cantidamedicina:"+cantidamedicina+"cantidadmedicinarestante:"+cantidadmedicinarestante+"contadordia:"+contadordia);
    if(cantidamedicina<=cantidadmedicinarestante){
        return contadordia;
    }
    return recursion(++contadordia, cantidamedicina - (cantidamedicina * 0.2), cantidadmedicinarestante) ;
}

测试

System.out.println(diaseneliminar(100, 80));
System.out.println(diaseneliminarRecursive(100, 80));

输出原件:

cantidamedicina:80.0cantidadmedicinarestante:19.999999999999996contadordia:1
cantidamedicina:64.0cantidadmedicinarestante:19.999999999999996contadordia:2
cantidamedicina:51.2cantidadmedicinarestante:19.999999999999996contadordia:3
cantidamedicina:40.96cantidadmedicinarestante:19.999999999999996contadordia:4
cantidamedicina:32.768cantidadmedicinarestante:19.999999999999996contadordia:5
cantidamedicina:26.2144cantidadmedicinarestante:19.999999999999996contadordia:6
cantidamedicina:20.97152cantidadmedicinarestante:19.999999999999996contadordia:7
cantidamedicina:16.777216000000003cantidadmedicinarestante:19.999999999999996contadordia:8
8

输出递归

cantidamedicina:100.0cantidadmedicinarestante:19.999999999999996contadordia:0
cantidamedicina:80.0cantidadmedicinarestante:19.999999999999996contadordia:1
cantidamedicina:64.0cantidadmedicinarestante:19.999999999999996contadordia:2
cantidamedicina:51.2cantidadmedicinarestante:19.999999999999996contadordia:3
cantidamedicina:40.96cantidadmedicinarestante:19.999999999999996contadordia:4
cantidamedicina:32.768cantidadmedicinarestante:19.999999999999996contadordia:5
cantidamedicina:26.2144cantidadmedicinarestante:19.999999999999996contadordia:6
cantidamedicina:20.97152cantidadmedicinarestante:19.999999999999996contadordia:7
cantidamedicina:16.777216000000003cantidadmedicinarestante:19.999999999999996contadordia:8
8

推荐阅读