【问题标题】:computes the logarithm of a number x relative to a base b.n other words计算数字 x 相对于底数 b.n 的对数
【发布时间】:2013-11-12 19:33:07
【问题描述】:

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

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

【问题讨论】:

  • 它做了什么你没想到的?另外,我意识到您正在执行一项任务,但任务很疯狂;这就像要求您在不使用任何轮子的情况下制造汽车。
  • @Dan:写一个整数日志函数是一个合理的知道怎么做的事情,而用浮点日志函数来写它不是一个好的答案(如果,比如说,你想要它可以处理太大而无法放入浮点数而不会损失精度或太大而根本无法容纳的数字)。
  • 我昨天回答了两次这个问题,但它立即被作者否决并删除。
  • 您的代码的一个明显问题是,如果成功,它会返回Noneprint 不会导致函数返回任何内容,它只是打印一个值。所以你这样做,然后break,然后从函数的末尾掉下来。 (此外,您几乎不需要print str(x),因为print 已经在其参数上调用了str。)只需return countreturn count-1
  • @Dan Integer 日志功能很简单,哈哈。它只需要像 3 年级/4 年级的数学。

标签: python python-2.7


【解决方案1】:

由于您还没有解释您要解决的问题,我所能做的就是猜测。但是……

你的函数永远不会返回一个数字。如果成功,它会打印出一个数字,然后从函数的末尾掉出并返回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))

从少量重复开始,以确保您不会在屏幕上发送垃圾邮件;当您对它更满意时,请使用更大的。同时,我会留给您找出一个可供选择的用于测试日志功能的好域。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2020-12-08
      相关资源
      最近更新 更多