如何在java或者python中不用math库而用递归写出精确度高的计算loga(n)的方法?
以a为底
def recursivelog(n, x, b, l=None, u=None):
assert( n >= 0)
assert( x >= 1)
assert( isinstance(b, int) )
assert( b >= 2 )
float(x)
if(x<b):
return 0
else:
return 1+ recursivelog(n-1,x/b,b)
我自己的程序精度太差而且返回的都是整数
另外推导的:
public static double loga1(int level, double a, double n) {
if (a <= 0 || n <= 0)
return Double.NaN;
if (level > 500)
return 1;
if (a == 1) {
return Double.NaN;
} else if (a > 1) {
if (n > a) {
return 1 + loga1(level + 1, a, n/a);
} else if (n == a) {
return 1;
} else { //n < a
return 1 / loga1(level + 1, n, a);
}
} else { //a < 1
return -loga1(level + 1, 1/a, n);
}
}
随便找一个程序
double MYLOG(double a)
{
int N = 15;//我们取了前15+1项来估算
int k,nk;
double x,xx,y;
x = (a-1)/(a+1);
xx = x*x;
nk = 2*N+1;
y = 1.0/nk;
for(k=N;k>0;k--)
{
nk = nk - 2;
y = 1.0/nk+xx*y;
}
return 2.0*x*y;
}
https://blog.csdn.net/mike190267481/article/details/7404702
然后关键来了,你不是要递归么?任何循环程序,都可以改写成递归
double foo(int k, int nk, double y)
{
if (k == 0) return 1.0/nk+xx*y;
return foo(k-1, nk - 2; 1.0/nk+xx*y);
}
double MYLOG(double a)
{
int N = 15;//我们取了前15+1项来估算
int k,nk;
double x,xx,y;
x = (a-1)/(a+1);
xx = x*x;
nk = 2*N+1;
y = 1.0/nk;
y=foo(N, nk, y);
return 2.0*x*y;
}