Перекурсив в iterativo с bottom-up

Это мой кодекс перекурсивной функции, написанной в не конечной форме, мне хотелось бы перемещать ее в iterativa с while, но правда я не могу сделать ее, советы, чтобы делать ее с bottom-up? Метод abc - корень cuadradra (x), и число реализованных повторений (n), больше больше лучшее повторение - результат.

public static Double abc(int x,int n){
    Double d = .0;
    if(n==0){ //caso base
        d = 1.0;
    }else{
        d = (abc(x,n-1)+(x/abc(x,n-1)))/2;
    }
    return d;
}

Это - то, что я попробовал с локоном while:

  public static Double abcIter(Integer x,Integer n){                 
    Double res = 1.0;
    Double r0=.0;
    Integer numeroAuxiliar = 0;

        while(numeroAuxiliar<=n){

            res = (res+(x/res))/2;
            r0 = res;
            res = (r0+(x/r0))/2;
            numeroAuxiliar++;
        }


    return res;
}

Когда я пробую какой-то корень, и повторение с while не дает мне точное значение. Взамен, первый метод, если, что следует мне хорошо. Советы на методе while, и bottom-up?

2
задан 25.10.2016, 19:55
2 ответа

Каждая перекурсивная функция с recursión очереди может быть превращенной в функцию iterativa.
Функция с recursión очереди та, что всегда заканчивается в return metodoRecursivo(parametros) или в return expresion_sin_llamada_recursiva.

Твоя функция не переиталик очереди, но возможно конвертировать в переиталик очереди вводя собирающий параметр (это самый тяжелый шаг):

public static Double abc(int x,int n){
  return abcRecurs(x, n, 1.0);
}  

public static double abcRecurs( int x, int n, double acc ) {
    if(n==0){ 
        return acc;
    }else{
        return abcRecurs( x, n-1,  (acc+x/acc)/2 );
    }
}

Однажды у нас есть функция в перекурсивной форме очереди шаги - всегда те же самые и делаются из механической формы.
Первый помещать цикл while (true) около функции:

public static double abcRecurs(int x, int n, double acc) {
  while (true) {
    if (n == 0) {
      return acc;
    } else {
      return abcRecurs(x, n - 1, (acc + x / acc) / 2);
    }
  }
}

Секунда, менять все так называемые переиталики abcRecurs( /*parm a*/ a1, /* parm b*/ b1, etc ) из-за: a=a1; b=b1; etc; continue;

public static double abcRecurs(int x, int n, double acc) {
  while (true) {
    if (n == 0) {
      return acc;
    } else {
      x = x;
      n = n - 1;
      acc = (acc + x / acc) / 2;
      continue;
    }
  }
}

И уже у тебя есть твоя функция iterativa. Чтобы заканчиваться ты можешь отлаживать ее немного. Например x=x; он ни для чего не служит.

public static double abcRecurs(int x, int n, double acc) {
  while ( n>0 ) {
    --n;
    acc = (acc + x / acc) / 2;
  }
  return acc;
}

И вслед за этим ты можешь сочетаться abc и abcRecurs в одной:

public static Double abc(int x, int n) {
  double acc = 1.0;
  while (n > 0) {
    --n;
    acc = (acc + x / acc) / 2;
  }
  return acc;
}
5
ответ дан 24.11.2019, 12:55

Попытайся с этим.

public static Double abcIter(Integer x, Integer n) {
    Double res = 1.0;
    Integer numeroAuxiliar = n;

    while (numeroAuxiliar !=0) {
        res = (res + (x / res)) / 2;
        numeroAuxiliar--;
    }

    return res;
}
2
ответ дан 24.11.2019, 12:55