1

我正在尝试编写一个代码来分析一个单词是否是回文。顺便说一句,回文是一个向后和向前读取相同的单词。例如“女士”或“中午”

这是一个尝试:

x = raw_input("please enter a word:\n")
L = len(x)

 # this part returns the first letter of the word

def first(word):
    return word[0]

# this part returns the last letter of the word

def last(word):
    return word[-1]


def middle(word):
    return word[1:-1]


def is_palindrome(word):
    if L <= 2:
        print 'enter a word with at least three letters'
    elif first(word) != last(word):
        print 'This word is not a palindrome'
    else:
        word = middle(word)
        is_palindrome(word)

is_palindrome(x) 

但是当执行时,我得到

IndexError: string index out of range
...line 7, in first return word[0]

“is_palindrome”的第一个分支完美运行。即当这个词不是回文时,我不会出错。像“noopn”执行没有错误,但错误在第二个分支

我已经多次使用此代码,但无法弄清楚“迭代部分”我有答案,但我还不想看它。我需要弄清楚两件事:1.一种使函数is_palindrome中的迭代正常工作的方法?2.最后退出程序的方法。

你们能指导我如何在不提供解决方案的情况下回答这些问题吗?

最后我应该把 print 语句放在哪里: print 'This word is a palindrome'

谢谢

4

6 回答 6

4

为了实现您的目标,为什么不使用:

string[::-1] == string

你回答的原因是当只有 1 个字母时,middle会返回一个空字符串,然后''[0]会导致错误。

于 2013-08-08T04:27:36.650 回答
3

您需要一个基本案例来进行递归。单字母词是回文,空字符串也是回文。

def is_palindrome(word):
    # handle the base case
    if len(word) <= 1:
        print 'This word is a palindrome'
    elif first(word) != last(word):
        print 'This word is not a palindrome'
    else:
        word = middle(word)
        is_palindrome(word)

如果要拒绝少于三个字母的单词,则可以使用调用递归函数的辅助函数:

def is_palindromeHelper(word):
    if len(word) <= 2:
        print 'enter a word with at least three letters'
    else:
        is_palindrome(word)
于 2013-08-08T04:29:58.177 回答
2

就个人而言,我更喜欢将支票和输出分开。所以is_palindrome()应该只返回答案而不负责告诉用户。这使得它更可重用。

def is_palindrome(word):
    # handle the base case
    if len(word) <= 1:
        return True
    elif first(word) != last(word):
        return False
    else:
        word = middle(word)
        return is_palindrome(word)

这使您能够

x = raw_input("please enter a word:\n")
L = len(x)

if L <= 2:
    print 'enter a word with at least three letters'
elif is_plaindrome(word):
    print 'This word is a palindrome'
else:
    print 'This word is not a palindrome'

这将有效性检查放在执行的前面,而在递归中,您只有在整个递归过程中都有效的检查。

(我怀疑您的检查是否有必要 - 有y没有oo回文?我们可以争论空字符串,但是......)

下一个改进步骤可能是省略函数first()last()并且middle()- 它们很简单,只使用一次,因此您可以将代码放在使用它们的地方。

于 2013-08-08T04:44:38.237 回答
1

在您的代码中添加了一个额外的条件,这将解决您的问题。当您只剩下一个字符时,您不需要调用 is_palindrome()

    x = raw_input("please enter a word:\n")
    L = len(x)

     # this part returns the first letter of the word

    def first(word):
        return word[0]


   # this part returns the last letter of the word

    def last(word):
        return word[-1]


    def middle(word):
        return word[1:-1]


    def is_palindrome(word):
        if L <= 2:
            print 'enter a word with at least three letters'
        elif first(word) != last(word):
            print 'This word is not a palindrome'
        else:
            word = middle(word)
            if len(word) > 1:
                is_palindrome(word)
            else:
                print 'This word is a palindrome'

    is_palindrome(x)
于 2013-08-08T04:37:44.460 回答
1

一个不考虑大写和空格的基本版本,我建议:

def is_palindrome(word):
    if len(word) < 3:
        print 'Enter a word with at least three letters'
    else:
        for letter in range(len(word)/2):
            if word[letter] != word[-letter - 1]:
                print "This word is not a palindrome"
                return
        print "This word is a palindrome"

虽然我认为它可能会亲自删除空白并使用 .lower() 进行比较。然后它将不区分大小写并允许测试短语或句子。

于 2013-08-08T21:35:01.150 回答
0

大方向的家伙。所有人都投了赞成票。

这些指示使我能够制作以下简洁的代码

代码 1

x = raw_input("enter a word to check if it is a palindrome:\n")

if x[::-1] == x:
    print 'yes this one is a palindrome'

else:
    print 'sorry try again by re-running the program'


代码 2

x = raw_input("enter a word to check if it is a palindrome:\n")

if len(x) <= 1:
    print 'Of course ', x, ' is a palindrome'

def is_palindrome(x):    
    if len(x) >= 2:
        if x[0]!=x[-1]:
            print 'This is not a palindrome'
        else:
            x = x[1:-1]
            return is_palindrome(x)
    print 'This is FINALLY a real palindrome'

is_palindrome(x)

我想我可以包含函数 is_palindrome 作为条件语句len(x) <= 1的第二个分支,但我更喜欢这种方式,因为代码都是关于这个函数的

于 2013-08-09T02:19:31.647 回答