我有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()
最终,我的输出将是您单击red
,orange
等时显示的列表。如果我可以通过这个小测试来输出类似的内容,则可以找出最后一点:
'apple'
'cat'
'red'
'orange'
'yellow'
'green'
'blue'
'apple'
'dog
'red'
'orange'
'yellow'
'green'
'blue'
...等等。
答案 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
循环(请参阅其他答案之一)