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