代码之家  ›  专栏  ›  技术社区  ›  anonn023432

通过转换为迭代加快递归方法

  •  0
  • anonn023432  · 技术社区  · 6 年前

    我正在写一个动态规划算法 Python 对于较小的输入,它似乎工作得很好,但对于较大的输入,它超时可能是因为递归调用。我读过这个 article 在线上说,大多数现代编程语言都不能很好地处理递归,最好将其转换为迭代方法。

    我的算法如下:

    def get_val(x,y,g,i,xlast,ylast):
        # checks if array over
        if(i>(len(x)-1)):
            return 0
        # else returns the max of the two values
        # dist returns the euclidian distance between the two points
        # the max condition just decides if it's profitable to move to the 
        # next x and y coordinate or if it would be better to skip this particular (x, y)
        return max(g[i]-dist(x[i],y[i],xlast,ylast) + get_val(x,y,g,i+1,x[i],y[i]),get_val(x,y,g,i+1,xlast,ylast))
    

    我一直在努力提高它的性能,但我真的不确定应该采取什么步骤来确保它不会在大量输入时超时。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Diego Fernando Bautista Torres    6 年前

    正在写入 动态规划 算法意味着您已经在处理递归调用,所以您当前的代码还不是动态编程。

    您需要确定导致问题的原因,然后提供一种解决方案,该解决方案以更少的步骤计算函数以交换内存消耗,即存储函数调用结果以避免对同一调用进行新的计算。

    我不知道你问题的所有细节,但似乎有 optimal substructure property .

    你会找到一个关于如何判断你正在处理什么样的问题以及如何解决它的指南 here

        2
  •  0
  •   Rasmus    6 年前

    如果我知道你想要完成什么,你可以使用生成器进入下一步。查看以下生成器技巧:

    http://linuxgazette.net/100/pramode.html

    或访问

    https://wiki.python.org/moin/Generators