【问题标题】:Python Recursion Limit Work AroundPython 递归限制解决方法
【发布时间】:2018-06-25 09:57:11
【问题描述】:

我目前正在处理一个 python 问题:

给定从 -infinity 到 +infinity 的数轴。您从 0 开始,可以向左或向右。条件是在第 i 步中,你走 i 步。第一步走1步,第二步走2步,以此类推。 提示:3 可以通过 2 个步骤 (0, 1) (1, 3) 达到。 2 可以分 3 步到达 (0, 1) (1,-1) (-1, 2)

a) 找到到达位置 1000000000 和 -1000000000 的最佳步数。

我已经成功编写了以下代码:

def steps(source, step, dest):
    if abs(source) > dest:
        return sys.maxint
    if source == dest:
        return step

    pos = steps(source+step+1, step+1, dest)
    neg = steps(source-step-1, step+1, dest)

    return min(pos, neg)

问题是即使这个函数给了我正确的答案,它也不能扩展到我要求的范围。有没有办法解决这个问题,还是我必须采用不同的方法来解决这个问题?

【问题讨论】:

  • 这感觉像是 dynamic programming / memoization 的工作。
  • 勾勒出一个动态规划算法似乎应该很简单,但我不确定它在多大程度上可以扩展到给定的数字。
  • @Robᵩ 不,简单的贪婪。

标签: python function recursion


【解决方案1】:

我认为这实际上可以用笔、纸和计算器来解决。我不想破坏整个谜题(听起来像是功课),但我会给出一些提示。

假设我们只是朝 1000000000 的方向走,即我们每次都向右走。

  • 你能想出一个封闭的公式来告诉你在n 步骤之后你在哪里吗?

  • 从那里,你能计算出在你“超过”超过 1000000000 之前需要多少步?这显然是所需步数的下限,因为步数越少,我们根本无法走完距离。

  • 在你超调的那一刻,你到底在哪里结束?

  • 最后,您能否修改路径,使您最终以相同的步数准确到达目标?

【讨论】:

    【解决方案2】:

    为避免递归,您可以将状态保存在列表中,我会更好地解释。

    def steps(source, step, dest):
        q = Queue()
        q.put((0,1))
        while True:
            source, ste = q.get()
            if abs(source) > dest:
                return sys.maxint
            if source == dest:
                return step
    
            q.put(source+step+1, step+1)
            q.put(source-step-1, step+1)
    

    这样做您将要检查的位置保存在队列中,并且每次检查不是最后一个位置时,您都会在队列末尾添加新的 2 位置。这种方法还保证找到的解是最短的。 为了进一步提高速度,您可以冷保存已访问过的号码列表,这将在每次您再次找到相同号码时停止研究,这将大大加快任务速度

    【讨论】:

    • 这在技术上避免了递归,但在概念上是等效的,并且程序无论如何都会耗尽内存,因为它正在尝试探索指数大小的搜索空间。
    • 你们都对,但我认为递归的限制远低于队列的限制,此外旧项目将被删除,因此将释放一些内存,而递归不会发生这种情况.
    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 2019-03-12
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多