Это мой кодекс перекурсивной функции, написанной в не конечной форме, мне хотелось бы перемещать ее в 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?
Каждая перекурсивная функция с 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;
}