2

実際にを使用せずに、基数(たとえば、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を返すはずです。そして確かにそれは最も効率的な方法ではないと私は信じています。それで、この場合だけでなく、ほとんどの場合、どうすればそれを修正してコードをより効率的にすることができますか?彼ら?

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

これが私の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

お役に立てれば

于 2012-11-03T01:29:14.097 に答える
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 に答える
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 に答える
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 に答える