Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在金字塔中查找可能的向下滑动_Python_Recursion - Fatal编程技术网

Python 在金字塔中查找可能的向下滑动

Python 在金字塔中查找可能的向下滑动,python,recursion,Python,Recursion,我对这个codewars/project euler问题失去了理智: 我需要找到所有可能的金字塔下滑中的最大和,我现在正试图计算金字塔中可能存在的下滑。它工作正常,但对于大于25的整数,函数开始非常慢 我的代码是: def find_seq(x): ''' input: x, positive integer greater than 1 Returns an array with the slides from the top to the bottom of an x floors hig

我对这个codewars/project euler问题失去了理智:

我需要找到所有可能的金字塔下滑中的最大和,我现在正试图计算金字塔中可能存在的下滑。它工作正常,但对于大于25的整数,函数开始非常慢

我的代码是:

def find_seq(x):
'''
input: x, positive integer greater than 1

Returns an array with the slides from the top to the bottom of
an x floors high pyramid
'''
list_slides = []
if x == 2:
    return [[0,0],[0,1]]
else:
    prev_slides = find_seq(x-1)
    for el in prev_slides:
        list_slides.append([0]+el)
    for el in prev_slides:
        list_slides.append([0]+list(i+1 for i in el))
return list_slides

我可以看到,每层楼的计算时间都呈指数增长,但我想不出任何其他方法来解决这个问题。

tl;dr:从下到上实现线性复杂度。

嗯,你是对的,它呈指数增长。
问题不在于代码,而在于方向 让我们从下往上看金字塔-您可以立即看到,如果您位于倒数第二层,并且希望向下滑动,您将选择直接位于您下方且具有较大值的路径,即您只能向左或向右滑动,且越大越好。
现在,从第三层到最后一层,您只需要找到下到下一层的路线,下一层的路线最好(当然是将底层的价值相加)。
像这样一直走到金字塔的顶端,到最后,你会得到最佳路线的价值,或者最长的幻灯片

代码:

def最长滑动(金字塔):
如果len(棱锥体)=1:
返回金字塔[0][0]
最后一层=金字塔[-1]
添加_层=[]
对于范围(1,len(最后一层))中的i:
添加层。追加(最大值(最后一层[i],最后一层[i-1]))
金字塔[-2]=[a+b代表a,b在zip中(金字塔[-2],添加_层)]
返回最长的幻灯片(金字塔[:-1])
对于那些追求效率的人来说,相同代码的简化版本:

将numpy导入为np
def最长滑动(金字塔):
如果len(棱锥体)=1:
返回金字塔[0][0]
金字塔=np.数组(金字塔)
金字塔[-2]+=np.最大值(金字塔[-1][:-1],金字塔[-1][1:])
返回最长的幻灯片(金字塔[:-1])

欢迎来到SO!我建议你调查一下。这个问题相当于,所以你可能会寻找关于这个问题的提示。我知道我需要在下一步应用备忘录,但如果你想现在就这样做,我不知道tbhIt如何容易地将解决方案交给你,如果你想要的话,一个快速的网络搜索会找到数千个解决方案,但我认为,自己研究记忆,浏览有关斐波那契数的教程,然后尝试将其应用到你的问题中,会更有教育意义/更令人满意。其思想是创建一个查找哈希——如果您以前使用特定参数调用过该函数,那么您只需返回该调用的解决方案,而不是从头开始重新执行该工作。重叠子问题。这是一个使用functools模块的Python单行程序。不,我不想要tbh解决方案。我已经搜索了有关memonization的内容,但我不知道在哪里重复对函数的调用。如果我找到了第(8)项,我需要计算一次第(7)项,我需要计算第(6)项,依此类推;但我只计算过一次。我不知道是否有其他方法来计算下滑……如果您在链接的CW kata描述中讨论示例,您所说的对于边缘元素是正确的,但是您可以看到中间的
4
可以从其上方一行的
7
4
访问。这意味着,当你将函数应用到中间元素时,它将做完全相同的工作,并多次将相同的值返回到三角形底部最佳路径的每一个父元素。如果您不确定,请打印函数调用中的参数,您将看到,随着行数的增加,重叠会增加复杂性。另一个解释自下而上方法的答案可能很有用---@mishadoff explainion