当前位置: 首页 > 知识库问答 >
问题:

计算回文的递归函数

唐伟
2023-03-14

我知道这个问题已经被问过很多次了,但是我的问题有点不同。这个任务要求我不验证一个字符串是否是回文——而是验证一个字符串中有多少回文(返回为“int”)。这应该使用迭代函数来完成

以下是我的迭代函数代码供参考:

def iterativePalindrome(str, n): 
    allPalindromes = [[0 for x in range(n)] for y in range(n)] 
    verify = [[False for x in range(n)] for y in range(n)]
  
    for i in range(n): 
        verify[i][i] = True

    for i in range(n - 1): 
        if (str[i] == str[i + 1]): 
            verify[i][i + 1] = True
            allPalindromes[i][i + 1] = 1
  
    for iterativeGap in range(2, n): 
        for start in range(n - iterativeGap): 
            end = iterativeGap + start; 

            if (str[start] == str[end] and verify[start + 1][end - 1]): 
                verify[start][end] = True
 
            if (verify[start][end] == True): 
                allPalindromes[start][end] = (allPalindromes[start][end - 1] + allPalindromes[start + 1][end] + 1 - allPalindromes[start + 1][end - 1]) 
            else: 
                allPalindromes[start][end] = (allPalindromes[start][end - 1] + allPalindromes[start + 1][end] - allPalindromes[start + 1][end - 1]) 

    return allPalindromes[0][n - 1]

我只是很难把它转换成递归函数。感谢所有帮助!

共有2个答案

章飞章
2023-03-14

我有一个递归的解决方案,但它再次计算一些值,这可以通过动态编程(记忆化)来克服。如有任何建议,将不胜感激。下面是递归的伪代码。

Check whether the string from 'start' index to 'end' index is a palindrome if yes -> inc. the answer and then
recursively check for other strings by removing first and last character from the current string

    import numpy as np
    #initializing dp array with zeros
    dp = np.zeros(shape = (len(st) , len(st))

    def CountPalindromes(st , start, end):
        if(dp[start][end] == 1): return 0
        flag = checkIfTheStringIsPalindrome(st , start, end)
        ans = 0
        if(flag): ans = 1
        dp[start][end] = 1
        if(start < end):
            return ans + CountPalindromes(st , start, end-1) + CountPalindromes(st , start+1 , end)
        else: return ans


     answer = CountPalindromes(st , 0 , len(st)-1)
     print(answer)

在上面的代码中,许多字符串将被重新检查,这将增加计数。为了解决这个问题,dp数组用于跟踪已经计算的子问题

百里金林
2023-03-14

我想我成功了!看看我的递归实现,它可以在字符串中找到所有回文,在我看来,这并不是解决它的最干净的方法(任何让它更简单的建议都会受到欢迎),请随意询问您不清楚的问题:

found = []
def count_palindrome(m_str, start, end, orig_len):
    if len(m_str)<2:
        return
    elif m_str == m_str[::-1]:
        if (start, end) not in found:
            found.append((start, end))
            if len(m_str)<orig_len:
                return
    counter = count_palindrome(m_str[:-1], start, end-1,  orig_len)
    counter = count_palindrome(m_str[1:], start+1, end, orig_len)

str_to_work_on = "acac"
count_palindrome(str_to_work_on, 0, len(str_to_work_on), len(str_to_work_on))
for indices in found:
    print(str_to_work_on[indices[0]:indices[1]])

输出:

aca
cac

# I tried it on more complex examples as well and it seems to work fine for my eyes,
# try to challenge it by giving extra complex examples and examine the results.
# let me know if you find something which not work as you expect
 类似资料:
  • 是否有一种方法可以编写递归函数,该函数打印数字中的位数,以便: -它是一个无效函数 -"if"条件是if(num==0),返回 -“else”将调用递归。 我看到了两种不同类型的代码,其中一种是“if”条件具有递归调用,另一种是用于“return”。但这不是我想要的。 我很不擅长递归,并试图通过自己编写代码来理解它,但没有成功。 这是我的代码(我明白为什么它打印122而不是3,但我真的不知道如何以

  • 定义一个接受1个参数的count_down函数。当你调用count_down(3)时,输出应该是这样的:3...2...1...0!。 我的代码如下: 但是输出是[3,2,1,0][4,3,2,1,0]如何获得如所讨论的格式所描述的格式:3...2...1...0!

  • 我想用尽可能多的方法解决塔式料斗问题,并计算每种方法的时间复杂性(仅用于自我练习)。解决方案之一是: 我知道递归时间复杂度计算的一般想法,但我在分析注释行(在 for 循环内)时遇到了麻烦。通常我用 )计算时间复杂度,并用一般表达式(例如 T(n-k))降低它,直到我达到基本情况并且可以用 n 表示 k,但是 for 循环的时间复杂度是多少?

  • 我有一个递归函数,它会重复这个函数,直到不满足if条件,然后输出一个整数。但是,此函数之外需要整数的函数正在接收一个单位。我应该如何修改代码以返回int? 这就是整个程序 }

  • 我正在编写一个递归函数,如下所示: 此函数用于接收员工并查找其管理者。如果找到管理器,则将管理器id推送到数组中($)- 所以我的问题是,如果我不在第6行返回递归调用(这是-

  • 本文向大家介绍C#递归实现回文判断算法,包括了C#递归实现回文判断算法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#递归实现回文判断算法,分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。