簡體   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