我正在尝试编写一个函数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
答案 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
。