繁体   English   中英

坚持使用递归实现排列。 没有得到任何 output

[英]Stuck with implementing permutations using recursion. Not getting any output

我想写一个 function permutations(route, cities) 它应该将一个列表( cities ),append cities的每个可能排列到route列表中,并将route中的每个排列打印在新的一行上。 每个排列必须从第一个城市开始,即“波士顿”。

我正在为此实现使用递归,但无法使其正常工作。

def permutations(route, cities):

    def recurs(cities_temp):

        if len(cities_temp) == 0:
            return []
        elif len(cities_temp) == 1:
            return [cities_temp]
        else:
            route_temp = []

            for i in range(len(cities_temp)):
                x = cities_temp[i] #x is item i in the input list
                y = cities_temp[:i] + cities_temp[1+i:] #y is the remaining (everything but item i)

                for j in recurs(y):
                    route_temp.append([x] + j)
            return route_temp

    route = recurs(cities)

    print(' '.join([city_names[i] for i in route]))

city_names = ["Boston", "Seattle", "Chicago", "Dallas"]

permutations([0], list(range(1, len(city_names)))) #calling the permutations function

大家可以看看它,让我知道我做错了什么吗?

我不知道您问题中的代码有什么问题,但认为您正在“重新发明轮子”,因为您可以使用itertools.permutations() function 来获取它们:

from itertools import permutations
from pprint import pprint

city_names = ["Boston", "Seattle", "Chicago", "Dallas"]
permutes = [(city_names[0],)+p for p in permutations(city_names[1:])]
pprint(permutes)

Output:

[('Boston', 'Seattle', 'Chicago', 'Dallas'),
 ('Boston', 'Seattle', 'Dallas', 'Chicago'),
 ('Boston', 'Chicago', 'Seattle', 'Dallas'),
 ('Boston', 'Chicago', 'Dallas', 'Seattle'),
 ('Boston', 'Dallas', 'Seattle', 'Chicago'),
 ('Boston', 'Dallas', 'Chicago', 'Seattle')]

我一直忽略这个练习,直到我有更好的心态,但最终能够像教练希望的那样解决它。

这是代码。 感谢您对我最初的问题的所有答复。

portnames = ["PAN", "AMS", "CAS", "NYC", "HEL"]

def permutations(route, ports):
    n = len(ports) - 1

    def recursion(ports):
        if len(ports) == 1:
            return [ports]
        else:
            lst = []

            for i in range(len(ports)):
                x = [ports[i]]
                xs = ports[:i] + ports[i+1:]

                for j in recursion(xs):
                    if len(j) == n:
                        lst.append(route + x + j)
                    else:
                        lst.append(x + j)
        
        return lst
    

    for p in recursion(list(range(1, len(portnames)))):
        print(' '.join([portnames[i] for i in p]))
                    
 
    return recursion(ports)

permutations([0], list(range(1, len(portnames))))

问题在于将置换索引与城市名称进行映射。我使用 map function 编辑了代码。 看一看。

def permutations(route, cities):

    def recurs(cities_temp):

        if len(cities_temp) == 0:
            return []
        elif len(cities_temp) == 1:
            return [cities_temp]
        else:
            route_temp = []
    
            for i in range(len(cities_temp)):
                x = cities_temp[i] #x is item i in the input list
                y = cities_temp[:i] + cities_temp[1+i:] #y is the remaining (everything but item I)

                for j in recurs(y):
                    route_temp.append([x] + j)
            return route_temp

    route = recurs(cities)

    # mapping index with city names from city_names list
    mapped_route = [list(map(lambda x : city_names[x],r)) for r in route]

    # adding boston in front of every permutation
    final_route = list(map(lambda x : "Boston "+x,[' '.join(r) for r in mapped_route]))

    print(final_route)


city_names = ["Boston", "Seattle", "Chicago", "Dallas"]

permutations([0], list(range(1, len(city_names))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM