Caeser Cypher с python recusrion

-1 StillGotLoveForTheStreets [2017-06-02 10:11:00]

Я пытался написать функцию encodeM которая в основном принимает строку s и целочисленное move которое сдвигает значение ascii символа. Я попробовал написать funtion нормальным способом, который, я думаю, работает правильно. Есть ли способ написать одну и ту же функцию с рекурсией? Я предоставил код для функции обычным способом:

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    

python recursion caesar-cipher


2 ответа


0 Netwave [2017-06-02 10:28:00]

Это не имеет особого смысла, но вам просто нужно стереть петлю, проверить базовый футляр и управлять одним элементом:

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)

Его уродливый и неэффективный способ сделать это.


0 Abrikot [2017-06-02 10:30:00]

Вы можете сделать следующее:

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 каждый символ.