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