迭代牛顿法递归(Java)
Iterative Newton's Method to recursive (Java)
我需要通过递归来使用牛顿法。我有这段代码使用迭代牛顿法,但我对编程很陌生,所以我不知道如何将它变成递归。我非常感谢一些视觉演示。
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);
}
通常我们想反其道而行之,即消除递归。如果是尾递归:
func(arguments) {
if (condition) {
return something(arguments)
}
arguments = modify_arguments(arguments)
return func(arguments)
}
有一个机械重写:
func(arguments) {
while (!condition) {
arguments = modify_arguments(arguments)
}
return something(arguments)
}
现在只需要反向应用即可。
也就是说,while (razn > e)
不是终止循环的可靠方法。如果导数很大,它可能会过早终止,远离根。
此外,使用英文作为标识符。 razn
俄语和英语看起来同样难看 reader。 delta_x
好多了。 pr
.
同上
我需要通过递归来使用牛顿法。我有这段代码使用迭代牛顿法,但我对编程很陌生,所以我不知道如何将它变成递归。我非常感谢一些视觉演示。
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);
}
通常我们想反其道而行之,即消除递归。如果是尾递归:
func(arguments) {
if (condition) {
return something(arguments)
}
arguments = modify_arguments(arguments)
return func(arguments)
}
有一个机械重写:
func(arguments) {
while (!condition) {
arguments = modify_arguments(arguments)
}
return something(arguments)
}
现在只需要反向应用即可。
也就是说,while (razn > e)
不是终止循环的可靠方法。如果导数很大,它可能会过早终止,远离根。
此外,使用英文作为标识符。 razn
俄语和英语看起来同样难看 reader。 delta_x
好多了。 pr
.