Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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_Dynamic Programming - Fatal编程技术网

Python 最长回文递归方法当开始和结束处的两个字符相等时,为什么要将计数与字符串的其余部分进行比较?

Python 最长回文递归方法当开始和结束处的两个字符相等时,为什么要将计数与字符串的其余部分进行比较?,python,recursion,dynamic-programming,Python,Recursion,Dynamic Programming,我试图理解python中使用递归方法和动态编程的最长回文的解决方案(还不明白为什么我们称之为动态编程) 我了解基本条件 我知道当两个字符相等时,我们会移动到字符串中的下一个字符,即 c=_longestPalen(st, b+1, e-1, c+2) 但我们为什么要这么做 return bigger(c, bigger(_longestPalen(st, b+1,e,c), _longestPalen(st, b, e-1, c))) 这是完整的代码 def longestPalen

我试图理解python中使用递归方法和动态编程的最长回文的解决方案(还不明白为什么我们称之为动态编程)

我了解基本条件

我知道当两个字符相等时,我们会移动到字符串中的下一个字符,即

c=_longestPalen(st, b+1, e-1, c+2)    
但我们为什么要这么做

return bigger(c, bigger(_longestPalen(st, b+1,e,c), _longestPalen(st, b, e-1, c)))
这是完整的代码

def longestPalen(st):
    res=_longestPalen(st, 0,len(st)-1, 0)
    return res

def bigger(x, y):
    if x>y:
        return x
    else:
        return y

def _longestPalen(st, b,e,c):
    if e<b: return c
    if b==e: return c+1
    if st[b] == st[e]:
        c=_longestPalen(st, b+1, e-1, c+2)
        return bigger(c, bigger(_longestPalen(st, b+1,e,c), _longestPalen(st, b, e-1, c)))
    return bigger(_longestPalen(st, b+1, e, 0), _longestPalen(st, b, e-1, 0))
def longestPalen(st):
res=_longestPalen(st,0,len(st)-1,0)
返回res
def(x,y):
如果x>y:
返回x
其他:
返回y
def_longestPalen(st、b、e、c):

如果e我稍微重新构造了代码,使其更符合Python约定:

def最长调色板:
返回最长的调色板(s,0,len(s)-1,0)
定义最长的颜色(s、b、e、c):
如果e

如果当前第一个和最后一个字符相同,则有四个选项:

  • 当前的第一个和最后一个字符都在最长的回文中。
    • 输入:“阿巴”
    • 最长回文:“阿巴”(4)
  • 只有当前第一个字符在最长回文中。
    • 输入:“cabbacxc”
    • 最长回文:“cabbac”(6)
    • 即使第一个和最后一个字符是“c”,但只有第一个字符在最长回文中,未来的递归步骤需要包括测试“cabbacx”和“cabbac”以获得正确答案
  • 只有当前最后一个字符位于最长回文中。
    • 输入:“cxcabbac”
    • 最长回文:“cabbac”(6)
    • 即使第一个和最后一个字符是“c”,但最后一个字符在最长回文中,未来的递归步骤需要包括测试“xcabbac”和“cabbac”以获得正确答案
  • 当前的第一个或最后一个字符都不在最长回文中。
    • 输入:“cyabbaxc”
    • 最长回文:“阿巴”(4)
    • 这个案例将在未来的递归步骤中处理,因为下一步将是“yabbax”,我们将处理“yabba”和“abbax”的测试
  • 你跑步的原因是什么

    c=_longestPalen(str,b+1,e-1,c+2)
    返回较大值(c,较大值(_longestPalen(str,b+1,e,c),_longestPalen(str,b,e-1,c)))
    

    返回最大值(_longest_palen(s,b+1,e-1,c+2),
    _最长的颜色(s、b+1、e、c),
    _最长的调色板(s、b、e-1、c))
    

    在修改的实现中,要考虑所有这些情况。

    此行的伪代码类似于:

    bigger(both_first_last_included, bigger(only_first_included, only_last_included))
    
    在修改后的实现中,我使用了我发现在理解正在发生的操作时更清晰的方法

    max(both_first_last_included, only_first_included, only_last_included)
    

    最好不要调用variables
    str
    ,因为这是一个被覆盖的内置函数。“动态规划”是一个毫无意义的企业流行语,在编程真正成为一件大事之前,它是为营销目的编造的,所以我不会太担心它。最后,我不确定为什么存在
    biger
    。似乎
    >
    更清楚了…?谢谢你对动态规划的观点,我刚刚修改了它,但我仍然没有关于BRe的答案:术语“动态规划”,这就是我们所知道的:明白了,基本上把一个更大的问题分解成更小的问题,关于我的主要问题有什么线索吗?哇,亨利解释得很好,我真的很感激。所以我正确地理解如果s[B]==s[e]:不正确。。然后我们试着从b+1,e或b,e-1开始,找出哪个更大。而
    c
    被重置为0,因为一旦发现第一个和最后一个字符不匹配,您就知道您不在回文中。