-6

基数 bn に対する数値 x の対数を計算する単純な手順 myLog(x, b) を記述します。言い換えると、myLog は、b の累乗が x 以下であるような b の最大累乗を返す必要があります。 .

x と b は両方とも正の整数です。b は 2 以上の整数です。関数は整数の答えを返す必要があります。

Python のログ関数は使用しないでください。代わりに、単純な算術演算子と条件付きテストを使用する、この問題に対する反復的または再帰的なソリューションを使用してください。

以下のコードで何が間違っていますか? 条件が失敗したときに何を返すかについて言及していないため、falseのままにしておきました

def myLog(x, b):
    count = 1

    while x > 0 and b >= 2:
        ans = b ** count
        if (ans == x):
            print str(count)
            break
        elif (ans > x):
            print str(count-1)
            break
        count += 1
    else:
        return False
4

2 に答える 2

2

どのような問題を解決しようとしているのかを説明していないので、推測するしかありません。しかし…</p>

関数が数値を返すことはありません。成功すると、数値が出力され、関数の最後に落ちて が返されますNone。失敗した場合は、 を返しますFalse。そしてreturn、コードのどこにも他にありません。

これは簡単に修正できます: -ingreturnではなく値だけです:print

def myLog(x, b):
    count = 1

    while x > 0 and b >= 2:
        ans = b ** count
        if (ans == x):
            return count
        elif (ans > x):
            return count-1
        count += 1
    else:
        return False

ans *= bの代わりにループを毎回実行することで、パフォーマンスを向上させることができますans = b ** count。数が巨大な場合は、で割っxb方がよい場合があります。通常、除算は乗算よりも遅くなりますが、巨大な数の領域から早期に抜け出すことは、除算を回避するよりも役立つ可能性があります。

また、条件の一部 (すべてではない) の不要な括弧など、いくつかのスタイルの問題もあります。

最後に、「テスト ドライバー」を作成することを検討してください。例えば:

repcount = 100
errcount = 0
for _ in range(repcount):
    x = generate_nice_random_x()
    b = generate_random_base()
    log1, log2 = myLog(x, b), int(math.log(x, b))
    if log1 != log2:
        print('log({}, {}): {} != {}'.format(x, b, log1, log2))
        errcount += 1
print('{}/{} errors'.format(errcount, repcount))

画面にスパムが表示されないように、小さな繰り返しカウントから始めます。あなたがそれに満足しているときは、はるかに大きなものを使用してください. それまでの間、ログ機能をテストするために選択するのに適したドメインを見つけるのはあなたに任せます。

于 2013-11-12T19:44:59.087 に答える