用于转换字符的递归函数

时间:2015-05-07 13:21:13

标签: python recursion

我正在尝试用Python编写一个程序,它使用递归函数将字符串中的所有小写字符转换为下一个字符。这是我的尝试:

def convert(s):

    if len(s) < 1:
        return ""

    else:
        return convert(chr(ord(s[0+1])))

print(convert("hello"))

当我尝试运行此程序时,它给出了错误:字符串索引超出范围。有人可以帮我纠正一下吗?我甚至不确定我的程序是否编码正确以提供所需的输出:/

2 个答案:

答案 0 :(得分:1)

您每次都尝试索引第二个字符; Python索引从0开始,因此0+11是第二个字符。你的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 sif 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以使代码变为025,然后添加1 mod 26,使0+1 = 11+1 = 2,... 。,24+1 = 2525+1=0。然后添加回97,以便代码代表az之间的字母。这样你的字母就会循环