计算对数,为什么这个算法效率不高,如何使它更有效?

2024-05-15 14:11:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道我是否可以在不实际使用log()的情况下,根据一个数相对于一个基数(例如,对数基数2为16)来计算一个数的对数。我设法做到了,但我不相信它是非常有效的。

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


Tags: 方法代码logreturnifdef对数情况
3条回答

如果有人给出了一个负值,比如myLog(-1,2),或者它是1 myLog(1,2),那么在循环之前计算ans,你知道它总是0,因为你把exp=0,然后在循环中再次计算它,而不必在更改exp之前

尝试递归:

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

这是我的两分钱:

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

希望这有帮助

相关问题 更多 >