-6

编写一个简单的程序 myLog(x, b),计算数字 x 相对于底数 bn 的对数,换句话说,myLog 应返回 b 的最大幂,使得 b 的该幂仍小于或等于 x .

x 和 b 都是正整数;b 是大于或等于 2 的整数。您的函数应返回整数答案。

不要使用 Python 的日志函数;相反,请使用简单算术运算符和条件测试的迭代或递归解决方案。

下面的代码有什么问题?由于他们没有提到条件失败时要返回什么,所以一直保持为假

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任何地方。

这很容易解决:只是return值而不是print-ing 它:

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. 如果数字很大,除法x可能b会更好——除法通常比乘法慢,但尽早离开大数域可能比避免除法更有帮助。

它也有一些风格问题,比如你的一些(但不是全部)条件的不必要的括号。

最后,您可能要考虑编写“测试驱动程序”。例如:

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 回答
0

这是一个关于考试的问题,目前正在进行中。MITx: 6.00.1x Introduction to Computer Science and Programming

于 2013-11-13T07:17:26.137 回答