我想知道是否可以根据相对于基数的数字(例如,16的基数2)计算数字的对数,而不实际使用log()
。我设法做到了,但我不相信它非常有效。
这是我在Python中的代码:
def myLog(x,b):
exp=0
ans=b**exp
while x!=ans:
ans=b**exp
if ans==x:
return exp
exp=exp+1
所以我可以给它myLog(16,2)
它应该返回4.确实它确实如此,但我认为它不是最有效的方式,所以我怎么能修复它并使我的代码更有效,而不仅仅是在这种情况下,但在大多数情况下?
答案 0 :(得分:4)
尝试递归:
def func(a, b, ans=0):
if a/b == 1:
return ans + 1
else: return func(a/b, b, ans+1)
In [26]: func(16, 2)
Out[26]: 4
In [27]: func(8, 2)
Out[27]: 3
In [28]: func(16,4)
Out[28]: 2
答案 1 :(得分:1)
这是我的两分钱:
def myLog(x,b):
exp = 0
ans = 1
while ans<x:
ans *= b
exp += 1
if ans == x:
return exp
else:
raise ValueError("can't find a suitable exponent")
In [10]: myLog(16,2)
Out[10]: 4
希望这有帮助
答案 2 :(得分:1)
如果有人给出负值(例如myLog(-1,2)或者如果它是1 myLog(1,2))你没有考虑到,那么你在你知道它的循环之前计算ans总是0,因为你把exp = 0,然后在循环中你再次计算它而不改变exp。
答案 3 :(得分:1)
假设:
x: a positive integer
b: a positive integer; b >= 2
returns: log_b(x), or, the logarithm of x relative to a base b.
似乎最短的方式是:
def myLog(x, b):
ans = 0
while b <= x:
ans += 1
x /= b
return ans
或递归:
def myLog(x, b):
if (b > x): return 0
else: return 1 + myLog(x/b, b)
答案 4 :(得分:0)
因为它是endless loop:
def myLog(x,b):
exp = 0
ans = b**exp
while x != ans:
ans = b**exp
if ans>x:
return -1
if ans == x:
return exp
exp = exp+1
另见:
答案 5 :(得分:0)
此版本增加了对非整数输出的支持:
def log(a, b):
b = float(b)
a = float(a)
g = a
n = 0
i = 1
while b**i != 1:
while g >= b**i:
g /= b**i
n += i
i /= b
return n
答案 6 :(得分:0)
def log(a, b):
b = float(b)
a = float(a)
g = a
n = 0
i = 1
while b**i != 1:
while g >= b**i:
g /= b**i
n += i
i /= b
return n
不适用于所有号码。 log(5,10)返回0.00000,应为0.69897