这是edx的课程计算机科学和使用Python编程的一个简短问题。
def program1(x):
total = 0
for i in range(1000):
total += i
while x > 0:
x -= 1
total += x
return total
问题:在最佳情况下运行程序1需要多少步骤?用n,输入x的大小来表达你的答案
回答:最佳案例:3003和最坏情况:5n + 3003
我对答案3003感到困惑,因为根据我的说法,问题的最佳情况是如果x = -1并且其他语句执行时会有一定的时间.hence 声明
total =0 // takes a constant amount of time 1
for i in range(1000):
total += i // takes 1000*1 amount of time
return total // takes constant of time 1
因此答案应该是1000 + 2 = 1002
任何有关正确解释的帮助都将受到高度赞赏。
答案 0 :(得分:2)
如果我正确理解您的问题,我认为理解答案的关键是行for i in range(1000):
正在做两个事情[ ed:请参阅下面的更新]每次通过你忽略计数的循环:首先,它是递增变量i
,第二,它是根据最大值(1000)检查它以查看循环是否完成。因此,每次遍历循环应该算作3次操作。
最后,即使跳过循环,仍然需要一个操作来决定这样做,即在行x
中检查0
对while x > 0:
。
这是在最好的情况下如何计算:
def program1(x):
total = 0 // counts as 1
for i in range(1000): // counts as 2 * 1000
total += i // counts as 1 * 1000
while x > 0: // counts as 1 + N (note: so when x <= 0, still counts as 1)
x -= 1
total += x
return total // counts as 1
......总计3003。
更新:
鉴于提供给您的最差案例答案是5n + 3003
,我必须修改我的答案。
这意味着while循环中的-=
和+=
操作必须被计为两个单独的操作(增量或减量和赋值)。如果是这样,则for循环中的+=
操作也必须计为2个操作。如果是这种情况,那么使数字与提供的答案一致的唯一方法是会计是这样的:
def program1(x):
total = 0 // counts as 1
for i in range(1000): // counts as 1 * 1000
total += i // counts as 2 * 1000
while x > 0: // counts as 1 + N
x -= 1 // counts as 2 * N
total += x // counts as 2 * N
return total // counts as 1
我个人不同意将+=
和-=
计算为抽象意义上的两件事,因为我知道它们可以在汇编中作为单个操作完成(假设所有值都在寄存器中) ),但在Python 中它们实际上是两个操作。 (有关详细信息,请参阅以下链接中的第4个答案。)
要接受此会计,您还必须接受每次循环时行for i in range(1000):
仅计为一个操作。一旦意识到我错了,我就找到了这个答案here,这有助于理解这一点。基本上,这是因为循环的上限和迭代元素本身是固定的。