给定的骰子可以制作给定的字符串吗?

时间:2015-08-26 01:45:18

标签: python recursion

我试图查看给定的骰子是否可以弥补给定的字符串。如果我们得到'IAM'

,请考虑这种特殊情况
given_set= [['I', 'B', 'A'], ['J', 'I', 'P',], ['M', 'R', 'S'], ['T', 'U', 'V']]

我的代码为此返回False。但是,如果我们从第二个列表中获取'I'并从第一个列表中获取'A',我们仍然可以创建该字符串。我想我除了这个之外还掩盖了大多数其他案件。

任何人都可以指导我如何解决这个特殊情况吗?

这是我的代码:

def possible(string, given_set):
    a = False

    if len(string) > len(given_set):
        return False

    if string == '':
        return True

    for i in string:

        for index, value in enumerate(given_set):

            if i in value:
                a = possible(string[1:],given_set[0:index] + given_set[index+1:])
                return a
            else:
                return False

1 个答案:

答案 0 :(得分:0)

您需要确保不会太快返回False,因为您仍然可以尝试其他可能性。在这里,您会看到我们只返回a True - 因为一旦您找到了解决方案,就无需继续寻找,您可以马上返回True。通过递归调用将返回True

如果return False中没有i,你也有value - 这意味着如果它不在你看的第一套中就放弃了,这也是错误的。我已经把这种情况转移到了循环之外,因为你只知道一旦你看过所有的集合就不可能了:

def possible(string, given_set):
    a = False

    if len(string) > len(given_set):
        return False

    if string == '':
        return True

    for i in string:

        for index, value in enumerate(given_set):
            if i in value:
                a = possible(string[1:],given_set[0:index] + given_set[index+1:])
                if a:
                    return a
        return False

现在我相信它有效:

given_set= [['I', 'B', 'A'], ['J', 'I', 'P',], ['M', 'R', 'S'], ['T', 'U', 'V']]

# possible cases
print possible("IJM", given_set) # True
print possible("IJT", given_set) # True
print possible("IIM", given_set) # True
print possible("JMT", given_set) # True
print possible("IMA", given_set) # True
print possible("VIB", given_set) # True
print possible("VPA", given_set) # True

# impossible cases
print possible("ZZZ", given_set) # False
print possible("ABC", given_set) # False
print possible("AIJ", given_set) # False
print possible("IJB", given_set) # False
print possible("VPT", given_set) # False
print possible("JRP", given_set) # False
print possible("RAS", given_set) # False