java - 如何在特定情况下将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;
}
提前致谢
解决方案
只需将其拆分为初始化和递归,将 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
推荐阅读
- c# - 调用带有参数列表的方法c#
- ios - “表达式太复杂”从数组文字初始化 Set
- django - 如何处理 HTML 中的过滤器对象
- docker - 无法通过 dockerized Traefik 访问 dockerized Neo4j webinterface
- c++ - Flex 仍然包含带有 noyywrap 和 nounistd 选项的 FlexLexer.h
- python - 如何根据周过滤数据时间对象的字典
- python - 运行 python doc 示例对 python 范围和命名空间一章有什么不理解?
- java - 如何以最快的方式用 Java 签署 XML
- django - jQuery 对话框中的 iframe 没有任何样式
- php - 如何获取默认值的记录