递归凯撒密码算法异常求助:密钥为2时输出结果不符预期?
递归凯撒密码加密错误的原因与修复方案
问题原因
你的递归逻辑存在核心错误:每次递归调用时,都会用当前完整的key值对文本做一次全量偏移,而非每次递归仅偏移1位。
当密钥为2时,程序执行流程是:
- 第一次调用:用
key=2加密"hello",得到"jgnnq" - 递归调用:用
key=1加密"jgnnq",得到"khoor" - 此时
key减为0,返回结果
最终总偏移量是2+1=3,自然得到了对应密钥3的结果"khoor"。只有当密钥为1时,递归仅执行一次,偏移量正确,所以结果正常。
修复方案
方案1:修正递归逻辑(每次仅偏移1位)
调整代码,让每次递归只对文本偏移1位,递归key次后完成总偏移:
def encrypt(plaintext, key): if key == 0: return plaintext ciphertext = "" for letter in plaintext: if letter.isalpha(): if letter.isupper(): # 每次仅偏移1位 new_letter = chr((ord(letter) - 65 + 1) % 26 + 65) else: new_letter = chr((ord(letter) - 97 + 1) % 26 + 97) ciphertext += new_letter else: ciphertext += letter return encrypt(ciphertext, key - 1)
测试:输入encrypt("hello", 2),会先得到"ifmmp",再递归得到"jgnnq",符合预期。
方案2:改用非递归实现(更高效)
凯撒密码本质是一次性计算总偏移,递归属于冗余设计。推荐直接实现单次偏移逻辑:
def encrypt(plaintext, key): key %= 26 ciphertext = "" for letter in plaintext: if letter.isalpha(): # 统一处理大小写基准值 base = ord('A') if letter.isupper() else ord('a') new_letter = chr((ord(letter) - base + key) % 26 + base) ciphertext += new_letter else: ciphertext += letter return ciphertext
这个版本无需递归,直接一次计算完成加密,效率更高且逻辑清晰。
内容的提问来源于stack exchange,提问作者MichaelMortimer
相关产品推荐
相关产品推荐

