【发布时间】:2016-12-22 22:10:53
【问题描述】:
简介
我正在尝试对Finding the position at n? 中引用的问题进行编码。为此,我只是使用了问题中发布的公式。我没有仔细阅读公式和答案,它们对我来说有点太复杂了。我用python写了代码,这里有表示。
算法描述(复制)
这种舞蹈要求每个表演者都遵循精确的舞步顺序:
• 第 0 阶段:首先,通过将起点设置在位置 0 来避开障碍物
• 第 1 阶段:向前迈出一步(+1 步)
• 第 2 阶段:后退两步(-2 步)
• 要遵循,每次都将获得您下一步必须采取的步骤和方向,这要归功于特定的计算:您在前一阶段采取的步数减去您在前一阶段采取的步数进入倒数第二阶段。
也就是说,在第 3 阶段,舞者必须向后退 3 步 (-2 - 1)。
在第 3 阶段,舞者在位置 -4。
阶段(n) = 阶段(n-1) - 阶段(n-2)
pos(n) = pos(n-1) + stage(n)
在第 4 阶段,舞者在位置 -5。
源代码
#!/usr/bin/python
if __name__=="__main__":
s = [0, 1, -2]
p = [0, 1, -1]
for n in range(3, 5):
diff = s[n - 1] - s[n - 2]
s.append(diff)
p.append(p[n - 1] + diff)
print "Position at stage %s is %s" %(n, p[len(p) - 1])
问题
我的问题是假设我们有超过 1000 万个阶段。列表 p 和 s 将增长并可能导致内存出现问题。有没有办法解决这个问题。除了使用列表之外,我找不到其他解决方案。
如果我删除第一个元素s.pop() p.pop(),这是一个超出范围异常的索引。这是正常的。除此之外,我不知道从哪里继续。
更新
这比我想象的要简单。
#!/usr/bin/python
if __name__=="__main__":
last_move = -2
penultimate_move = 1
previous_position = -1
for n in range(3, 5):
#compute current move and position
current_move = last_move - penultimate_move
current_position = previous_position + current_move
#do switch in here
penultimate_move = last_move
last_move = current_move
previous_position = current_position
print "current position %s" %current_position
【问题讨论】:
-
你总共只需要三个变量:当前位置、最后一步和倒数第二步。剩下的只是迭代。问题出在哪里?
-
或者,将其转换为您的代码:您只使用索引 n-1 和 n-2。为什么要记住其余的?
-
我的问题是如何记录这些变量。这就是我尝试使用列表的原因。这让我陷入了麻烦,我想哈哈