我碰壁试图解决这个问题,但不确定如何解决这个问题。
我的想法是比较每个字符串的前两个字符,如果它们相同,则将该字符保存在索引位置偏移的字母字符串中。 通过删除机密的第一个字符来递归其余字符串。如果前几个字符不同,请递归但删除字母字符串的第一个字符。
我不确定如何在其余字母中递归。
alphabet = "abcdefghijklmnopqrstuvwxyz"
def caesar_encrypt(secret, shift):
if len(secret) == 0:
return ""
elif shift == 0:
return secret
else:
if secret[0] == alphabet[0]:
return alphabet[shift] + caesar_encrypt(secret[1:],shift)
else:
return caesar_encrypt(secret,shift), alphabet[1:]
答案 0 :(得分:1)
我建议使用str.index
查找字符串中每个字符在字母表中每个字符的索引。之后,使用它索引字母并递归。
您应该注意的一些陷阱:
如果字符串中包含空格,请将该字符串原样放置在字符串中,然后移至下一个字符
您需要处理环绕声,如果我们在字母的末尾并且您选择的偏移量超过了字母的末尾,则需要环绕并转到字母的开头。
这应该有效:
alphabet = "abcdefghijklmnopqrstuvwxyz"
def caesar_encrypt(secret, shift):
if len(secret) == 0:
return ""
elif shift == 0:
return secret
elif secret[0] == ' ': # New - handle spaces
return ' ' + caesar_encrypt(secret[1:], shift)
else:
index = (alphabet.index(secret[0]) + shift) % len(alphabet) # Find the right place to access the alphabet
return alphabet[index] + caesar_encrypt(secret[1:], shift) # Use this new character then recurse
注意:此实现仅处理小写字母。
答案 1 :(得分:0)
如何?
def shift_alphabet(shift):
return alphabet[shift:] + alphabet[:shift]
def caesar_encrypt(secret, shift):
coded_alphabet = shift_alphabet(shift)
coded = [coded_alphabet[alphabet.index(i)] for i in secret]
coded = ''.join(coded)
return coded
使用map / lambda代替:
def shift_alphabet(shift):
return alphabet[shift:] + alphabet[:shift]
def encrypt_letter(letter, coded_alphabet):
return coded_alphabet[alphabet.index(letter)]
def caesar_encrypt(secret, shift):
coded_alphabet = shift_alphabet(shift)
coded = map(lambda x: encrypt_letter(x, coded_alphabet), secret)
coded = ''.join(coded)
return coded