做一个线性表演的递归回文函数

时间:2015-09-27 16:25:04

标签: python recursion palindrome linear-programming

所以我必须构建一个函数来检查某些东西是否是回文,但它必须是递归的,它必须是线性的,它必须忽略标点符号。我不能使用任何导入,我的老师告诉我,使用翻译功能不够有效。我试图重新设计它,但我非常难过。

def isPalindrome(word):
    newWrd = word.translate(None, "., ").lower()
    if  len(newWrd) <= 1:
        return True
    elif  newWrd[0] !=  newWrd [-1]:
        return False
    else:
        return isPalindrome(newWrd[1:-1])

2 个答案:

答案 0 :(得分:1)

概念和动机很简单:

  • 检查当前字符串的第一个和最后一个字符。
    • 如果匹配,请重复上一个操作,但只拍摄尚未处理的字符串片段。
    • 如果不匹配,请返回False
  • 长度为1的字符串默认为回文。

这就是我想出的。下面假设一个统一的案例,并且所有标点符号都被删除了,但是如果你想在这个方法中做到这一点,我把它留作读者的练习。

def palindrome(word):
    if not word:
        return False
    if len(word) == 1:
        return True
    else:
        if word[0] == word[-1]:
            return palindrome(word[1:-1])
        else:
            return False

答案 1 :(得分:0)

通常情况下,您应导入string并使用string.punctuation,但由于您不想导入任何内容,因此您只需将其硬拷贝到您的代码中即可。

由于你已经拥有isPalindrome()递归函数,你可以编写一个wrapper函数isPalindromeWrapper(),它将获取输入,处理它(删除标点符号),然后调用isPalindrome()功能。

punctuations = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

def removePunctuations(word):
    return ''.join( [ c for c in word if c not in punctuations ] )

def isPalindrome(word):
    print('isPalindrome({}) called.'.format(word))
    if len(word) < 2:
        return True
    if word[0] == word[-1]:
        return isPalindrome(word[1:-1])
    return False

def isPalindromeWrapper(word):
    word = removePunctuations(word)
    return isPalindrome(word)

print isPalindromeWrapper('ab,c!b?a')

输出:

isPalindrome(abcba) called.
isPalindrome(bcb) called.
isPalindrome(c) called.
True
相关问题