Search code examples
javaalgorithmrecursioniterationnewtons-method

Iterative Newton's Method to recursive (Java)


I need to use Newton's method using recursion. I have this piece of code using iterative Newton's method, but I'm very new to programming so I can't wrap my head around how to turn it into recursion. I would really appreciate some visual demonstration.

public static double f(double x){ 
    return x*x*x-3.5*x*x+0.5*x + 5;
}
public static double prf(double x) { 
    return 3 * x * x - 7 * x + 0.5;
}
// ВЫЧИСЛЕНИЕ КОРНЯ МЕТОДОМ НЬЮТОНА
public static double x_newton(double a, double e) {
    double x = a; 
    double razn;
    do {
        double xn = x - f(x) / prf(x); 
        razn = Math.abs(xn - x); 
        x = xn; 
    } while (razn > e); 

    return x - f(x)/prf(x); 
}

Solution

  • Usually we want to go other way around, that is, eliminate the recursion. In case of a tail recursion:

    func(arguments) {
        if (condition) {
            return something(arguments)
        }
        arguments = modify_arguments(arguments)
        return func(arguments)
    }
    

    there is a mechanical rewrite:

    func(arguments) {
        while (!condition) {
            arguments = modify_arguments(arguments)
        }
        return something(arguments)
    }
    

    Now you only need to apply it backwards.


    That said, while (razn > e) is not a robust way to terminate the loop. In case the derivative is very large, it may terminate too early, far away from the root.

    Also, use English for identifiers. razn looks equally ugly for both Russian and English reader. delta_x is way better. Ditto for pr.