Python:单击所有可能的(更改的)菜单组合

时间:2018-08-01 12:53:27

标签: python recursion

我有3个菜单,其中每个菜单取决于随后的菜单选择(menu_3取决于menu_2的选择,menu_2取决于menu_1的选择)。我试图通过单击最后一个菜单,然后遍历选项来获得所有可能的组合。然后返回menu_2,选择下一项,然后遍历所有新的menu_3选项。我一直在创建一个无限循环/无限递归,或者经过一次迭代后就停止了。

(我正在网站上进行此操作,因此,我试图继续在本地进行处理,而不是继续向该站点发送请求。)

这是我当前所在的位置,正在创建无限递归:

menu_1 = ['apple', 'orange', 'banana']
menu_2 = ['cat', 'dog', 'bird', 'fish']
menu_3 = ['red', 'orange', 'yellow', 'green', 'blue']
menu_names = ['menu 1', 'menu 2', 'menu 3']
menus = [menu_1, menu_2, menu_3]

def recursion_testing(depth = len(menus) - 1, count = 0):
    for i in range(depth):
        print('count: ' + str(count))
        if count == depth:
            print('menu: ' + menu_names[count])
            for j in range(len(menus[count])):
                print(menus[count][j])
            count = 0
        else:
            return recursion_testing(depth, count+1)

recursion_testing()

最终,我的输出将是您单击redorange等时显示的列表。如果我可以通过这个小测试来输出类似的内容,则可以找出最后一点:

'apple'
'cat'
'red'
'orange'
'yellow'
'green'
'blue'
'apple'
'dog
'red'
'orange'
'yellow'
'green'
'blue'

...等等。

3 个答案:

答案 0 :(得分:0)

根据经验,我认为您应该使用词典来存储菜单。这样,您可以更轻松地计算树叶(并计算树枝,这是菜单组合)。

答案 1 :(得分:0)

由于这些菜单的数量有限,因此无需递归即可获得所有这些菜单:

t.decimal :price, precision: 19, scale: 4

这为您提供了菜单的所有可能的长度3组合。

答案 2 :(得分:0)

进行简单的递归:

menu_1 = ['apple', 'orange', 'banana']
menu_2 = ['cat', 'dog', 'bird', 'fish']
menu_3 = ['red', 'orange', 'yellow', 'green', 'blue']
menu_names = ['menu 1', 'menu 2', 'menu 3']
menus = [menu_1, menu_2, menu_3]


def recursion_testing(menus):
    """Returns a list of solutions
    each solution is a list of strings"""
    if len(menus) == 1:
        return [menus[0]]

    subtree_solutions = recursion_testing(menus[1:])
    return [[item] + subtree_solution for item in menus[0] for subtree_solution in subtree_solutions]

print(recursion_testing(menus))
# [['apple', 'cat', 'red', 'orange', 'yellow', 'green', 'blue'], ['apple', 'dog', 'red', 'orange', 'yellow', 'green', 'blue'], ['apple', 'bird', 'red', 'orange', 'yellow', 'green', 'blue'], ['apple', 'fish', 'red', 'orange', 'yellow', 'green', 'blue'], ['orange', 'cat', 'red', 'orange', 'yellow', 'green', 'blue'], ['orange', 'dog', 'red', 'orange', 'yellow', 'green', 'blue'], ['orange', 'bird', 'red', 'orange', 'yellow', 'green', 'blue'], ['orange', 'fish', 'red', 'orange', 'yellow', 'green', 'blue'], ['banana', 'cat', 'red', 'orange', 'yellow', 'green', 'blue'], ['banana', 'dog', 'red', 'orange', 'yellow', 'green', 'blue'], ['banana', 'bird', 'red', 'orange', 'yellow', 'green', 'blue'], ['banana', 'fish', 'red', 'orange', 'yellow', 'green', 'blue']]


# or if you want a flat list
import itertools
print(list(itertools.chain.from_iterable(recursion_testing(menus))))
# ['apple', 'cat', 'red', 'orange', 'yellow', 'green', 'blue', 'apple', 'dog', 'red', 'orange', 'yellow', 'green', 'blue', 'apple', 'bird', 'red', 'orange', 'yellow', 'green', 'blue', 'apple', 'fish', 'red', 'orange', 'yellow', 'green', 'blue', 'orange', 'cat', 'red', 'orange', 'yellow', 'green', 'blue', 'orange', 'dog', 'red', 'orange', 'yellow', 'green', 'blue', 'orange', 'bird', 'red', 'orange', 'yellow', 'green', 'blue', 'orange', 'fish', 'red', 'orange', 'yellow', 'green', 'blue', 'banana', 'cat', 'red', 'orange', 'yellow', 'green', 'blue', 'banana', 'dog', 'red', 'orange', 'yellow', 'green', 'blue', 'banana', 'bird', 'red', 'orange', 'yellow', 'green', 'blue', 'banana', 'fish', 'red', 'orange', 'yellow', 'green', 'blue']

如果菜单的深度始终相同,则只需嵌套for循环(请参阅其他答案之一)