<function>(str1,str2)分别调用它们</function>

时间:2013-11-02 20:20:24

标签: python string recursion

首先,这个 IS 作业,所以我不期待任何直接的答案。我需要取一个由函数(semordnilap(str1, str2))定义的两个字符串,我需要看一下它们是否相反。我想知道我是否可以使用semordnilap(str1[0:1) == semordnilap(str2[-1])单独调用这些函数。我尝试了几种方法,我不能正确地思考它,当然还有尝试以递归方式执行此操作的踢球者。任何建议或指示都会有所帮助。

def semordnilap(str1, str2):
    '''
    str1: a string
    str2: a string

    returns: True if str1 and str2 are semordnilap
    False otherwise.
    '''
    if len(str1) != len(str2):
        return False
    if len(str1) <= 1 or len(str2) <= 1:
        return False
    if semordnilap(str1[0]) != semordnilap(str2[-1]):
        return False
    else:
        return True

这是我到目前为止所遇到的错误TypeError: semordnilap() takes exactly 2 arguments (1 given)

2 个答案:

答案 0 :(得分:3)

给定两个字符串str1str2,比较一个是否等于另一个字符串的最简单方法是使用切片:

str1 = 'racecar'
str2 = 'racecar'

str1 == str2[::-1]
Out[57]: True

这实际上只是检查str1是否是回文(即与其相反)。

如果确实想要使用递归,那么 也希望使用切片:检查str1[0]是否= str2[-1],然后以str1[1:]str2[:-1]递归调用您的函数。

[::-1]语法为extended slicing语法,对字符串以及列表和其他序列有效。

答案 1 :(得分:2)

要反转字符串,请使用'this is a string'[::-1]

[::-1]切片表示法是否包含从字符串的开头到结尾的所有内容,但反过来执行。 'abcdefghijk'[6:1:-2]输出'gec',因为它从第6个索引(从0开始)到第1个索引,但不包括第一个索引,反向步长为2.

详细了解切片表示法:Explain Python's slice notationhttp://docs.python.org/2.3/whatsnew/section-slices.html

def semordnilap(str1, str2):
    if str1 == str2[::-1]: return True
    else: return False

递归执行此操作的一种方法:

def semordnilap(str1, str2):
    if not (len(str1) or len(str2)): return True
    if not (len(str1) and len(str2)): return False
    if str1[0] != str2[-1]: return False
    return semordnilap(str1[1:], str2[:-1])

第一行检查两个字符串是否为空(0评估为False,其他任何数字为True)。 len(str1)以整数形式返回长度。

然后检查是否只有一个字符串为空,在这种情况下它们不相等。

然后检查第一个字母是否与最后一个字母相同。

然后用每个字符串重复该过程(减去str1的第一个字母,减去str2的最后一个字母)。直到达到其中一个基本案例。基本案例是返回的内容。因此,当第一个字母等于每一轮的最后一个字母时,它将仅返回True,直到两个字符串同时用完字符为止。