递归程序:我做错了什么?

时间:2013-08-08 04:24:21

标签: python python-2.7 recursion

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

这是一个尝试:

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'这个词是回文'

谢谢

6 个答案:

答案 0 :(得分:4)

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

string[::-1] == string

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

答案 1 :(得分: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)

答案 2 :(得分: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'

这会将有效性检查放在执行的前面,而在递归中,您只有在递归时有效的检查。

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

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

答案 3 :(得分: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)

答案 4 :(得分: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()进行比较。然后它将不区分大小写,并允许测试短语或句子。

答案 5 :(得分: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)&lt; = 1 的第二个分支,但我更喜欢这种方式,因为代码都是关于这个函数的