Caeser Cypher与python recusrion

时间:2017-06-02 07:11:30

标签: python recursion caesar-cipher

我正在尝试编写一个函数encodeM,它基本上采用字符串s和整数move来移动字符的ascii值。我尝试用我认为正常工作的正常方式编写功能。有没有办法用递归编写相同的函数?我用正常的方式提供了函数的代码:

def encodeM(s,move):
    newStr=""    
    for char in message:
        num=ord(char)
        if char.isalpha():
            num+=move
            if char.isupper():
                if num>ord("Z"):
                    num-= 26
                elif num<ord("A"):
                    num+= 26
             elif char.islower():
                 if num>ord("z"):
                     num-= 26
                 elif num<ord("a"):
                    num+=26
            newStr+=chr(num)
        else:
            newStr+=char

    return newStr    

2 个答案:

答案 0 :(得分:0)

它没有多大意义,但你只需要擦除循环,检查基本情况并操作一个元素:

def encodeM(s, move):
    if s == "":
        return s
    char = s[0]
    num = ord(char)
    if char.isalpha():
        num += move
        if char.isupper():
            if num > ord("Z"):
                num -= 26
            elif num < ord("A"):
                num += 26
        elif char.islower():
            if num > ord("z"):
                num -= 26
            elif num < ord("a"):
                num += 26
        char += chr(num)
    return char + encodeM(s[1:], move)

这是一种丑陋而低效的方式。

答案 1 :(得分:0)

您可以执行以下操作:

def encodeM(s, move, n = 0):
    if n >= len(s):
        return s
    char = s[n]
    num = ord(char)
    if char.isalpha():
        num += move
        if char.isupper():
            if num>ord("Z"):
                num-= 26
            elif num<ord("A"):
                num+= 26
        elif char.islower():
            if num>ord("z"):
                num-= 26
            elif num<ord("a"):
                num+=26
        s = s[:n] + chr(num) + s[n+1:]
    return encodeM(s, move, n+1)

print(encodeM("abcdef",42))  # Just input your string and your move variable

此递归将一个字母移一个字母。

如果您愿意,还有另一种方式:

def encodeM2(s, move, n = 0):
    if n >= move:
        return s
    newStr = ""
    for char in s:
        num = ord(char)
        if char.isalpha():
            num += 1
            if char.isupper():
                if num>ord("Z"):
                    num-= 26
                elif num<ord("A"):
                    num+= 26
            elif char.islower():
                if num>ord("z"):
                    num-= 26
                elif num<ord("a"):
                    num+=26
            newStr+=chr(num)
        else:
            newStr += char
    return encodeM2(newStr, move, n+1)

这个将所有字符移动1,然后调用自己,直到每个字符移动move