简体   繁体   中英

<function>(str1, str2) calling them separately

First off, this IS homework, so I am not expecting any direct answers. I need to take two strings defined by a function ( semordnilap(str1, str2) ) and I need to see if they are equal when one is reversed. I was wondering if I can call these separately out of the function with semordnilap(str1[0:1) == semordnilap(str2[-1]) I tried this a few ways and I must not be thinking about it correctly, plus of course there is the kicker of trying to do this recursively. Any advise or direction would be helpful.

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

This is what I have so far, getting error of TypeError: semordnilap() takes exactly 2 arguments (1 given)

Given two strings str1 and str2 , the easiest way to compare if one is equal to the reverse of the other is by using slicing:

str1 = 'racecar'
str2 = 'racecar'

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

Which is really just checking if str1 is a palindrome (ie a reverse of itself).

If you really want to use recursion, you also want to be using slicing: check if str1[0] == str2[-1] , and then recursively call your function on str1[1:] and str2[:-1] .

The [::-1] syntax is extended slicing syntax, which is valid for strings as well as lists and other sequences.

To reverse a string you use 'this is a string'[::-1] .

[::-1] Is slice notation which says include everything from the start to the end of the string but do it in reverse. 'abcdefghijk'[6:1:-2] outputs 'gec' because it goes from the 6th index (starting with 0) up to but not including the first index, in reverse steps of 2.

Read up more on slice notation: Explain Python's slice notation , http://docs.python.org/2.3/whatsnew/section-slices.html

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

One way to do it recursively:

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])

The first line checks if both strings are empty ( 0 evaluates to False , any other number is True ). len(str1) returns the length as an integer.

Then it checks if only one of the strings is empty in which case they are not equal.

Then it checks if the first letter is the same as the last letter.

Then it repeats the process with the each string (minus the first letter of str1 and minus the last letter of str2). It goes until one of the base cases is reached. The base case is what is returned. So it will only return True when then first letter was equal to the last letter each round until both strings ran out of characters at the same time.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM