Python递归限制解决方法

时间:2018-01-16 16:14:11

标签: python function recursion

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

给出从-infinity到+ infinity的数字行。从0开始,可以向左或向右。条件是,在移动中,你采取我的步骤。在第一步中采取1步,第二步采取2步等。 提示:3步可以分2步(0,1)(1,3)。可以以3个步骤(0,1)(1,-1)( - 1,2)

达到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)

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

2 个答案:

答案 0 :(得分:4)

我认为这实际上可以通过笔,纸和计算器来解决。我不想破坏整个拼图(听起来像家庭作业),但我会给出一些提示。

想象一下,我们只是走向1000000000的方向,即我们每次都向右走。

  • 您能否提出一个封闭的公式,告诉您n步之后的位置?

  • 从那里,您可以计算出它将超过"超过"过去10亿?这显然是所需步数的下限,因为步数较少,我们无法覆盖距离。

  • 在你超调的那一刻,你究竟到底在哪里?

  • 最后,您是否可以修改路径,以完全符合目标的方式,以相同的步数进行修改?

答案 1 :(得分: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位置。该方法还保证找到的解决方案是最短的。 为了提高速度,您可以保存已经访问的号码列表,这样每次您再次找到相同号码时都会停止研究,这将大大加快任务的速度