使用递归仅将输入字符串的字母连接成单个输出字符串

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

“给定一个包含字母和特殊字母 characters/numbers 的字符串,使用递归将字母连接成一个字符串并 return 它。”

我的代码在下面,我仍在学习递归并且一直在尝试跟踪它。我在这段代码中尝试了一堆不同的行,但我不知道如何修复我目前所做的:

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

我还没有 return 任何东西,因为我正在努力处理必须将新字母连接到输出字符串的部分。而不是 .join 我也试过:

decoded += decoder(encryptedStr[1:])

但它不起作用 bc Nonetype??

您的主要问题是您没有 return,但您的方法存在一些问题,使这比需要的更复杂。

做递归时先考虑尾部优先——你的结束条件是什么,你如何决定继续。通常使用这种方法,您可以执行以下操作:1) 处理列表中的单个值,2) 让递归方法处理其余的值,3) 合并结果。

这里尾部优先 return 的一个简单指标是 return 如果字符串为空则什么都没有:

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

现在在每个 运行 中我们想要对一个字母进行操作并将其余的传递给递归调用。忽略特殊字符要求,你会得到这样的东西:

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

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

    return first + rest

现在我们可以处理要省略字母的特殊情况了。

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

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

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

    return first + rest

仅此而已!

一些重构的奖励:

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

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

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

这里有一堆问题:

  • 我不认为 join 在这种情况下会按照您的意愿去做。如果您想将一些字符串加在一起,只需使用 +=join 会在 decoder(encryptedStr[1:]) returns.
  • 之间插入 decoded 字符
  • 您没有 len(encryptedStr) == 0 的案例,因此 returns 默认值为 None。这就是为什么你不能将它的结果附加到 decoded.

Return没事就马上。否则取符合条件的第一个字母,加上递归调用的结果(其中参数为当前加密后的字符串,不带第一个字符)。

def decoder(encrypted):
    if not encrypted:
        return ''
    decrypted = encrypted[0] if encrypted[0].isalpha() else ''
    return decrypted + decoder(encrypted[1:])

print(decoder('Abc123rtZ5'))

结果是AbcrtZ


奖金信息(如评论中提到的@JonSG):

运行 这与 print(decoder('A' * 1000)) 你会明白为什么递归对于这个任务来说是个坏主意。

每个递归函数都必须有一个停止递归的基本条件,否则函数会无限调用自身。 仅递归地将输入字符串的字母连接成单个输出字符串:

some_string = "I2L4o2v3e+P;y|t!o#n"


def decoder(encryptedStr, decoded = ""):
    if len(encryptedStr) == 0:  # Base condition
        return decoded
    if encryptedStr[0].isalpha():
        decoded += encryptedStr[0]
        return decoder(encryptedStr[1:], decoded)
    # If the char in the index [0] is not a letter it will be sliced out.
    return decoder(encryptedStr[1:], decoded)


print(decoder(some_string))

输出:

ILovePython