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。确实如此,但是我相信这不是最有效的方法,所以我该如何修复它并使我的代码更高效,不仅在这种情况下,而且在大多数情况下他们?

4

7 回答 7

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
于 2012-11-03T01:30:27.393 回答
1

您没有考虑是否有人给出负值,例如 myLog(-1,2) 或者如果它是 1 myLog(1,2),那么您在循环之前计算 ans,您知道它始终为 0,因为您将exp = 0,然后在循环中再次计算它而不更改exp。

于 2012-11-03T02:52:02.200 回答
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)
于 2014-09-26T20:01:00.130 回答
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

希望这可以帮助

于 2012-11-03T01:29:14.097 回答
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.69897 时返回 0.00000

于 2014-07-20T05:05:25.047 回答
0

因为它是一个无限循环

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

也可以看看:

于 2012-11-03T01:26:40.870 回答
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
于 2014-01-30T23:20:15.583 回答