使用for循环遇到“超时”错误

时间:2018-08-12 21:16:55

标签: python for-loop

我最近开始学习python,并遇到了一个名为CodingBat的网站。在他们的一项练习(http://codingbat.com/prob/p190859)中,我假定一个函数接受三个输入:“小”,“大”和“目标”,并返回一个值作为输出。输出应为使用足够数量的“大”后达到“目标”所需的“小”数量,其中一个“小”的值= 1,一个“大”的值= 5。以下代码使该网站给我一个错误“超时”。

def make_chocolate(small, big, goal):

  for i in range(small+1):
    for j in range(big+1):
      if 5 * j + 1 * i == goal:
        return i
  return -1

我知道使用其他方法(例如,楼层分割)可以轻松解决此问题。因此,获得正确答案并不是我真正想要的。我只是想知道为什么会出现错误以及如何改进代码以使其正常工作。谢谢。

2 个答案:

答案 0 :(得分:1)

“超时”错误与python不相关。它来自您正在使用的网站。他们似乎设置了时间限制,因此迫使您创建有效的解决方案。在您的情况下,显然网站故意为trait Arrow1[F[_, _]] abstract class Test { def f1[F[_, _] : Arrow1, A, B, C](fa: F[A,B], fb: F[A, C]): F[A, (B, C)] def f2[A: Seq, B](a: A): Boolean } public abstract class Test { public abstract <F, A, B, C> F f1(F var1, F var2, Arrow1<F> var3); public abstract <A, B> boolean f2(A var1, Seq<A> var2); } 的值传递了太大的数字,并且双循环耗时太长。因此,他们希望您使用另一种可以很容易解决问题的方法。

答案 1 :(得分:0)

Blue Note的答案是正确的,因为这不是Python错误,而是网站施加的限制。您嵌套的for Koop花了太长时间。

您是对的,楼层划分是解决此问题的方法。 Python具有一个称为divmod()的强大函数,该函数返回商的元组以及一个数除以另一个的余数。它可以一行完成。

我在下面举了一个例子。假设将small划分为big次后,您只需要次数goal

def make_chocolate(small, big, goal):

    # Get remainder after dividing big into goal
    # divmod() returns a tuple of (quotient, remainder)
    # We just need the remainder at index 1
    remainder = divmod(goal, big)[1]

    # Need to divide this by small (default = 1)
    return remainder / small

我保留了相同的函数名称; make_chocolate():)