计算对数,为什么这个算法效率不高,以及如何提高效率?

时间:2012-11-03 01:20:40

标签: python algorithm

我想知道是否可以根据相对于基数的数字(例如,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.确实它确实如此,但我认为它不是最有效的方式,所以我怎么能修复它并使我的代码更有效,而不仅仅是在这种情况下,但在大多数情况下?

7 个答案:

答案 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