while循环满足条件未终止,Vigenere密码代码列表长度不一致如何修复
问题原因
- 你代码的while循环仅在进入内层for循环前判断
i < len(a)的终止条件,内层for循环遍历完整key的过程中不会做条件检查,哪怕中途i已经超过a的长度,仍然会继续往b中追加元素直到当前轮次的key遍历完成,最终导致b的长度大于a。 - 实例验证:你提供的测试用例中,去掉空格后的明文列表a长度为19,当i=18时满足条件进入for循环,追加第一个key字符后i变为19,已经不符合终止条件,但剩下的5个key字符还是会被依次追加到b中,最终b的长度为24,和a长度不一致。
优化方案
推荐方案:取模运算实现(逻辑更简洁,无冗余判断)
直接通过下标取模的方式匹配明文和密钥长度,不需要嵌套循环:
plaintext = "This is secret message" plaintext = plaintext.upper() key = "secret" key = key.upper() def encrypt_vigenere2(key, plaintext): a = [] b = [] # 提取明文非空格字符 for letter in plaintext: if letter != " ": a.append(letter) # 预处理密钥,去掉空格 key_clean = [c for c in key if c != " "] key_length = len(key_clean) # 生成与明文等长的密钥序列 for index in range(len(a)): b.append(key_clean[index % key_length]) return a,b print(encrypt_vigenere2(key,plaintext))
兼容原有写法的修复方案
如果要保留你原本的嵌套循环逻辑,只需要在内层每次i自增后新增终止判断,满足条件就跳出for循环即可:
plaintext = "This is secret message" plaintext = plaintext.upper() key = "secret" key = key.upper() def encrypt_vigenere2( key, plaintext ): a = [] b= [] i = 0 for letter in (plaintext): if letter != " ": a.append(letter) while i<len(a): for element in key: if element != " ": b.append(element) i +=1 # 新增终止判断,达到长度立刻跳出循环 if i >= len(a): break return a,b print(encrypt_vigenere2(key,plaintext))
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

