我正在尝试用Python编写一个程序,它使用递归函数将字符串中的所有小写字符转换为下一个字符。这是我的尝试:
def convert(s):
if len(s) < 1:
return ""
else:
return convert(chr(ord(s[0+1])))
print(convert("hello"))
当我尝试运行此程序时,它给出了错误:字符串索引超出范围。有人可以帮我纠正一下吗?我甚至不确定我的程序是否编码正确以提供所需的输出:/
答案 0 :(得分:1)
您每次都尝试索引第二个字符; Python索引从0
开始,因此0+1
是1
是第二个字符。你的len()
测试并没有防范它,它只测试空字符串。
你也只传递一个字符到递归调用,所以你总是得到一个长度为1的字符串,它没有第二个字符。
因此,使用'hello'
进行的测试可以做到这一点:
convert('hello')
len('hello') > 1 -> True
s[0+1] == s[1] == 'e'; chr(ord('e')) is 'e'
return convert('e')
len('e') > 1 -> True
s[0+1] == s[1] -> 'e'[1] raises an index error
如果你想使用递归,那么你需要决定如何正确检测递归路径的结束。例如,您可以测试短于 2 字符的字符串,因为在这种情况下没有下一个字符。
您还需要决定委托给递归调用的内容。对于这样的转换,您可以传入字符串的余数。
最后但并非最不重要的是,您需要测试您要替换的角色是否实际上是小写的。
答案 1 :(得分:1)
您想要返回移位的字符,然后在字符串的其余部分调用convert
函数。如果必须使用递归,则需要检查字符串是否已用尽(if not s
与if len(s) == 0
相同,因为''
等同于False
)并保释:< / p>
def convert(s):
if not s:
return ''
c = s[0]
i = ord(c)
if 96 < i < 123:
# for lower-case characters permute a->b, b->c, ... y->z, z->a
c = chr(((i-97)+1)%26 + 97)
return c + convert(s[1:])
print(convert('hello'))
print(convert('abcdefghijklmnopqrstuvwxyz'))
输出:
ifmmp
bcdefghijklmnopqrstuvwxyza
&#39; a&#39;的ASCII代码和&#39; z&#39;分别为97和122,因此我们仅将移位应用于代码i
在此范围内的字符。如果角色是z
,请不要忘记换行:你可以用模运算来完成:((i-97)+1)%26 + 97
。
编辑说明:减去97以使代码变为0
到25
,然后添加1
mod 26,使0+1 = 1
,1+1 = 2
,... 。,24+1 = 25
,25+1=0
。然后添加回97
,以便代码代表a
和z
之间的字母。这样你的字母就会循环