当 xˣ = N 时求 x 值的递归程序
Recursive program to find the value of x when xˣ = N
当xx = N时,我需要求x的值,N是输入的值。假设 N 为 27。在此示例中,x 值为 3,因为 27 的立方根为 3,即 33 = 27。如果 N 为 256,则 x 将为4、由于44 = 256.
我需要找出一个计算出 x 值的递归程序。这是我目前所拥有的:
public static void main(String[] args) {
Scanner n = new Scanner(System.in);
System.out.println("Enter a number");
double number = n.nextDouble();
}
public static void findXValue(double n) {
double logn = Math.log(n);
...
findXValue
功能使用了日志,但也不起作用。而且我还需要使用递归方法。任何帮助将不胜感激
public static double findXValue(double n) {
double result = 0.0;
double number = 0.0;
while(result <= n) {
result = Math.pow(number, number);
if(result == n) {
return number;
}
number++;
}
return -1;
}
我假设 x 可以是浮点数,因为你没有说。
您可以将此视为求函数 F(x) = xx - N 的根的问题。最简单的方法称为二分法,它可以工作像二进制搜索。
从区间 [a, b] 开始,使得 F(a) 和 F(b) 的符号相反。对于这个问题,由于函数的性质,它总是 F(a)<0 和 F(b)>0。如果 N > 1,则从 [1,N] 开始。如果 0 <= N < 1,则使用 [N,1]。 (如果 N = 1,则 x = 1)。
之后,迭代。计算 x = (a+b)/2。如果 F(x) 和 F(a) 同号(负),则设 a=x。否则 F(x) 必须与 F(b) 具有相同的符号(正数),因此设置 b=x.
当a和b最多相差一个unit-of-least-precision(可能的最小浮点差)时,停止并return a.
这种迭代很容易表示为递归。我不会给你答案。
double solve(double a, double b, double n) {
if (b - a <= ULP) return a;
// all the fun happens here
}
同样的技术也适用于整数,但在计算中点时要注意溢出和舍入错误。
使用Newton's method求根。
import java.util.Scanner;
public class XPowerX {
static final double PRECISION = 0.00001;
static final int MAX_RECURSION = 10000;
public static void main(String[] args) {
Scanner n = new Scanner(System.in);
System.out.println("Enter a number");
double number = n.nextDouble();
System.out.println(findXValue(number));
}
public static double findXValue(double n) {
double seed = Math.random();
double y = Math.pow(seed, seed);
double derivative;
for(int i = 0; i < MAX_RECURSION; i++) {
if (Math.abs(y) <= PRECISION) {
return seed;
}
y = Math.pow(seed, seed);
derivative = y * Math.log(seed) + y;
y -= n;
// The derivative is used as the slope of tangent line
// Newton's method
seed = seed - y / derivative;
if(seed < 0) {
seed = 0;
}
}
return -1;
}
}
输出:
Enter a number
16
2.7453680235674636
Enter a number
0.8
0.7395336501071896
Enter a number // No real root
0.3
-1.0
Enter a number // Overflow (NaN)
125000
-1.0
当xx = N时,我需要求x的值,N是输入的值。假设 N 为 27。在此示例中,x 值为 3,因为 27 的立方根为 3,即 33 = 27。如果 N 为 256,则 x 将为4、由于44 = 256.
我需要找出一个计算出 x 值的递归程序。这是我目前所拥有的:
public static void main(String[] args) {
Scanner n = new Scanner(System.in);
System.out.println("Enter a number");
double number = n.nextDouble();
}
public static void findXValue(double n) {
double logn = Math.log(n);
...
findXValue
功能使用了日志,但也不起作用。而且我还需要使用递归方法。任何帮助将不胜感激
public static double findXValue(double n) {
double result = 0.0;
double number = 0.0;
while(result <= n) {
result = Math.pow(number, number);
if(result == n) {
return number;
}
number++;
}
return -1;
}
我假设 x 可以是浮点数,因为你没有说。
您可以将此视为求函数 F(x) = xx - N 的根的问题。最简单的方法称为二分法,它可以工作像二进制搜索。
从区间 [a, b] 开始,使得 F(a) 和 F(b) 的符号相反。对于这个问题,由于函数的性质,它总是 F(a)<0 和 F(b)>0。如果 N > 1,则从 [1,N] 开始。如果 0 <= N < 1,则使用 [N,1]。 (如果 N = 1,则 x = 1)。
之后,迭代。计算 x = (a+b)/2。如果 F(x) 和 F(a) 同号(负),则设 a=x。否则 F(x) 必须与 F(b) 具有相同的符号(正数),因此设置 b=x.
当a和b最多相差一个unit-of-least-precision(可能的最小浮点差)时,停止并return a.
这种迭代很容易表示为递归。我不会给你答案。
double solve(double a, double b, double n) {
if (b - a <= ULP) return a;
// all the fun happens here
}
同样的技术也适用于整数,但在计算中点时要注意溢出和舍入错误。
使用Newton's method求根。
import java.util.Scanner;
public class XPowerX {
static final double PRECISION = 0.00001;
static final int MAX_RECURSION = 10000;
public static void main(String[] args) {
Scanner n = new Scanner(System.in);
System.out.println("Enter a number");
double number = n.nextDouble();
System.out.println(findXValue(number));
}
public static double findXValue(double n) {
double seed = Math.random();
double y = Math.pow(seed, seed);
double derivative;
for(int i = 0; i < MAX_RECURSION; i++) {
if (Math.abs(y) <= PRECISION) {
return seed;
}
y = Math.pow(seed, seed);
derivative = y * Math.log(seed) + y;
y -= n;
// The derivative is used as the slope of tangent line
// Newton's method
seed = seed - y / derivative;
if(seed < 0) {
seed = 0;
}
}
return -1;
}
}
输出:
Enter a number
16
2.7453680235674636
Enter a number
0.8
0.7395336501071896
Enter a number // No real root
0.3
-1.0
Enter a number // Overflow (NaN)
125000
-1.0