MIT6_0001F16_Pset4

这篇博客介绍了MIT6_0001F16_Pset4实验,内容涉及递归函数、类的构造与继承、字典和字符串操作。实验要求实现字符串排列、Caesar密码加密解密以及更复杂的替换密码。通过面向对象编程技术,使用类和递归解决加密解密问题,提高了代码的可读性和可维护性。

MIT6_0001F16_Pset4

此次实验的实验目的主要在于实现一些简单的加密、解密算法,核心在于对原句子中的字母建立某种映射关系,使得通过该映射关系实现句子的加密,并通过映射算法或者强行破解的方式(通过暴力模拟每种可能的映射关系并判断每种可能的映射关系所解码的单词正确性筛选出最优的映射)进行解密。

此次实验的涉及知识点主要包括递归函数的使用,类的构造继承以及类方法的构建,以及字典、字符串。
具体题目需要查看MIT的pdf题目文档

Part A: Permutations of a string :
A部分主要是通过递归的方法得到一个字符串的所有可能排序结果,例如"abc"返回[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”],为了更好地实现该递归函数,我构造了两个辅助函数,分别为

#该函数用于将某个字符插入到一个string中,返回所有可能的情况的[]
def insert_char_string(a,b)
#该函数用于将某个字符插入到一个[string]序列中,返回所有可能情况的[]
def insert_char_strings(a,b)

在两个辅助函数基础上,便可以构建出递归的递归条件以及终止条件:

如果字符串长度小于等于1,返回原字符串列表即可

否则,返回一个将该string的首字母插入到该string去除首字母的部分进行递归返回的[string]中,这里的插入指的是调用insert_char_strings方法,基于该算法思想,具体代码如下:

#该函数用于将某个字符插入到一个string中,返回所有可能的情况的[]
def insert_char_string(a,b):
    '''
     a是一个字符,b是一个string,返回a插入b任意间隔形成的列表
    '''
    result=[]
    i=0
    #将a插入到b的任意间隔中,返回所有可能情况组成的list
    while i<=len(b):
        the_string=b[0:i]+a+b[i:len(b)]
        result.append(the_string)
        i+=1
    return result

#该函数用于将某个字符插入到一个[string]序列中,返回所有可能情况的[]
def insert_char_strings(a,b):
    
    '''
     a是一个字符,b是一个[string],返回一个[string]
    '''
    result=[]
    #将字符对每个[string]中的元素进行操作的结果返回
    for each in b:
        result+=insert_char_string(a,each)
    return result
#得到一个string的全排列
def get_permutations(sequence):
    #如果sequence是单一字符或者空字符,返回[sequence]即可
    if  len(sequence)==1 or len(sequence)==0:
        return [sequence]
    #如果sequence是长度大于1的字符串,则需要额外操作
    else:
        #初始化一些变量
        result=[]
        length=len(sequence)
        #取now_string为不包括首个字符的string
        now_string=sequence[1:length]
        #调用已有函数并进入继续递归
        result+=insert_char_strings(sequence[0],get_permutations(now_string))
        #采用list(set(result))的主要原因在于避免由于存在相同字符导致最后的string中存在重复结果
        return list(set(result))

下面是该函数的一些测试:

#测试的函数为:
if __name__ == '__main__':
#    #EXAMPLE
     example_input = 'abc'
     print('Input:', example_input)
     print('Expected Output:', ['abc', 'acb', 'bac', 'bca', 'cab', 'cba'])
     print('Actual Output:', get_permutations(example_input))
    
     example_input='122'
     print('Input:', example_input)
     print('Expected Output:', ['122', '221', '212'])
     print('Actual Output:', get_permutations(example_input))
     
     example_input='abcd'
     print('Input:', example_input)
     print('Expected Output:',  ['abcd','abdc','acbd','acdb','adbc','adcb','bacd','badc','bcad','bcda','bdac','bdca','cabd','cadb','cbad','cbda','cdab','cdba','dabc','dacb','dbac','dbca','dcab','dcba'])
     print('Actual Output:', get_permutations(example_input))

测试函数代码运行:

Input: abc
Expected Output: ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
Actual Output: ['bac', 'cab', 'cba', 'bca', 'acb', 'abc']
Input: 122
Expected Output: ['122', '221', '212'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值