Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Using recursion to concatenate ONLY the letters of an input string into a single output string

"Given a string of both letters and special characters/numbers, use recursion to concatenate the letters into a single string and return it."

My code is below, I’m still learning recursion and am stuck in trying to trace it. I tried a bunch of different lines in this code but idk how to fix what I do have so far:

def decoder(encryptedStr):
    if len(encryptedStr) != 0:
        if encryptedStr[0].isalpha() == True:
            decoded = encryptedStr[0]
            decoded.join(decoder(encryptedStr[1:]))
            print(decoded)
        else:
            decoder(encryptedStr[1:])

I haven’t had it return anything yet because I’m struggling with the part where I have to join the new letters to the output string. Instead of .join I also tried:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

decoded += decoder(encryptedStr[1:])

but it doesn’t work bc Nonetype??

>Solution :

Your main issue is that you didnt return, but there are some issues with your approach that make this more complex than need-be.

Think tail-first when doing recursion- What is your end condition, and how do you decide to continue. Typically with this kind of method you do something like, 1) process a single value in the list, 2) let the recursive method handle the rest of it, 3) combine the results.

An easy indicator of the tail-first return here would be to return nothing if the string is empty:

def decoder(encryptedStr):
    if len(encryptedStr) == 0:
        return ""
    ...

Now in each run we want to operate on one letter and pass the rest to a recursive call. Ignoring the special character requirement, you’d get something like this:

def decoder(encryptedStr):
    if len(encryptedStr) == 0:
        return ""

    first = encryptedStr[0]
    rest = decoder(encryptedStr[1:])

    return first + rest

Now we can handle the special case where we want to omit letters.

def decoder(encryptedStr):
    if len(encryptedStr) == 0:
        return ""

    first = encryptedStr[0]
    rest = decoder(encryptedStr[1:])

    if not first.isalpha():
        first = ""

    return first + rest

And that’s all there is to it!

Bonus for some refactoring:

def clean(letter):
    return letter if letter.isalpha() else ""

def decoder(encrypted):
    if len(encrypted) == 0:
        return ""

    return clean(encrypted[0]) + decoder(encrypted[1:])
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading