使用递归仅将输入字符串的字母连接成单个输出字符串
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
“给定一个包含字母和特殊字母 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. 之间插入 - 您没有
len(encryptedStr) == 0
的案例,因此 returns 默认值为None
。这就是为什么你不能将它的结果附加到decoded
.
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