当前位置: 首页 > 知识库问答 >
问题:

如何在特定情况下将while循环转换为递归方法

闻人伟
2023-03-14

我需要帮助将这个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;
}

提前致谢

共有1个答案

龚睿
2023-03-14

只需将其在初始化和递归中分开,将while-critearia否定为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
 类似资料:
  • 我有一个递归算法,我用它来迭代分层数据结构,但不幸的是,对于一些数据,分层结构太深,以至于我得到了一个StackOverflow错误。我见过这种情况发生在大约150个节点的深度上,而数据可能会增长到更远的程度。对于上下文,这段代码将在有限的环境中运行,改变JVM堆栈大小不是一个选项,数据结构是给定的,代表不同的文件系统和目录和文件。 为了解决堆栈溢出问题,我尝试将算法转换为迭代算法。这不是我以前必

  • 问题内容: 我正在尝试将此for循环重写为for每个循环。 这就是我尝试过的 谁能指出我正确的方向?谢谢。 问题答案: 我认为您想得太多… :)

  • 问题内容: 是否每个递归函数都有一个等效的for循环?(两者都达到相同的结果)。 我有这个递归函数: 假设单词是Set [],并且单词[i] =单词长度为i的集合。 我想做的是:使用一个单词(例如,“ stackoverflow”,没有空格)启动递归,我试图查找该单词是否可以切成子单词(“ stack”,“ over”,“ flow”) ..子词的最小长度为3,并且假设长度为i的子词在Set wo

  • 作为练习,我将一些旧代码转换为函数流。我对溪流了解不多。看起来转换这段代码应该很简单,但我运气不太好。该方法从给定的整数开始,将其传递给isPrime,如果它是prime,isPrime将返回true。然后将要打印的新(下一个)素数交给用户。如果isPrime为false,则i递增,我们检查下一个整数。

  • 我已经开始使用Java8,并尝试将代码中的一些循环和旧语法转换为lambdas和streams。 举个例子,我试图转换这个time和for循环到流,但我没有得到它的权利: 我想知道是否有可能将上面的示例转换为单个流,其中for循环内部有一个而循环。

  • 问题内容: 我目前正在通过切换到PDO来更新我的应用。我有以下代码: 在上面的代码之后,var $ productidLst为1,2,我想使用与此等效的PDO: 我已经尝试了多种组合,但是没有成功,因此对此提供任何帮助将不胜感激(在第二个代码块$ res中是sql)。其次,我将参数$ productidLst设置为INT是否正确或应该是字符串? --------------------更新1 --