我的单词评分函数问题

时间:2016-10-09 04:00:46

标签: python recursion

所以这是我的代码:

def word_score(string1, string2):    
    '''Returns the word score for two strings'''    
    if len(string1) == 0 or len(string2) == 0:    
        return 0    
    else:    
        if string1[0] in string2:                
            return 1 + word_score(string1[1:], string2)    
        else:    
            return word_score(string1[1:], string2)  

基本上,对于每个字符串之间共享的每个字母,分数应该增加1。但是不应该重复,但我的代码有时会根据输出重复字母。我必须为此使用递归,并且不能使用map或key之类的东西,因为我们还没有在课堂上学到这一点。这个实验室的任务非常棘手,我试过调试,所有的同学都被困在周二。

下面是一些不起作用的输出以及它们应该返回的内容:

word_score('always', 'walking')返回4,但应该返回3,因为重复有一个额外的

word_score('recursion', 'excursion')返回9,但由于重复

,应该再次返回8

正确的输出:

word_score('diner', 'syrup')正确返回1

word_score('always', 'bananas')正确返回3

3 个答案:

答案 0 :(得分:1)

假设您无法使用setdictCounter,一种方法是逐个迭代string1中的字符并使用{{ 3}}检查是否可以从string2找到它。如果找到了字符,则通过组合匹配索引之前和之后的切片,将1添加到结果并构造新的string2

def word_score(string1, string2):
    if not string1 or not string2:
        return 0

    index = string2.find(string1[0])
    if index != -1:
        return 1 + word_score(string1[1:], string2[:index] + string2[index+1:])
    else:
        return word_score(string1[1:], string2)

TEST_CASES = [
    ['always', 'walking'],
    ['recursion', 'excursion'],
    ['diner', 'syrup'],
    ['always', 'bananas']
]

for s1, s2 in TEST_CASES:
    print('word_score({}, {}) -> {}'.format(s1, s2, word_score(s1, s2)))

输出:

word_score(always, walking) -> 3
word_score(recursion, excursion) -> 8
word_score(diner, syrup) -> 1
word_score(always, bananas) -> 3

<强>更新

假设str方法不可用,您可以自行轻松实施搜索,假设允许str.findrange

def word_score(string1, string2):
    if not string1 or not string2:
        return 0

    for i in range(len(string2)):
        if string1[0] == string2[i]:
            return 1 + word_score(string1[1:], string2[:i] + string2[i+1:])

    return word_score(string1[1:], string2)

答案 1 :(得分:0)

您可以在列表中转换str,然后在一组中转换以消除重复项并检查交叉点。

def word_score(string1, string2):
    '''Returns the word score for two strings'''
    string1=list(string1)
    string2=list(string2)
    string1=set(string1)
    string2=set(string2)
    if len(string1) == 0 or len(string2) == 0:
        return 0
    else:
        return len((string1.intersection(string2)))

编辑你不能使用交集,但列表,而你可以使用吗?

def word_score2(string1, string2):
    '''Returns the word score for two strings'''
    string_temp1=list(string1)
    string_temp2=list(string2)
    if len(string_temp1) == 0 or len(string_temp2) == 0:
        return 0
    else:
        if string_temp1[0] in string_temp2:
            while string1[0] in string_temp1:
                string_temp1.remove(string1[0])
            return 1 + word_score2(string_temp1, string_temp2)
        else:
            return word_score2(string_temp1[1:], string_temp2)

答案 2 :(得分:0)

当出现“肯定匹配”时,您可以尝试“擦除”第二个字母的字母。 这样,您的重复问题就会消失。