2016-04-13 8 views
2

Ich habe diesen einfachen Code hier läuft für Projekt Euler Frage 31.Python List Werte werden geändert/mutiert

Der Euler Q ist nicht erforderlich; Ich möchte nur wissen, warum meine Listenwerte mutiert werden, d. H. Es wird eine Liste mit vielen Listen von [2.0, 2.0, 2.0, 2.0, 2.0] gedruckt.

coins = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0] 


perms = [] 
def check(c): 
    if sum(c) == 2: 
     print c, "lol", sum(c) 
     perms.append(c) 
    return perms 

c = [0] * 5 
for c[0] in coins: 
    for c[1] in coins: 
     for c[2] in coins: 
      for c[3] in coins: 
       for c[4] in coins: 
        check(c) 

print perms 

Arbeit wird dadurch nicht aus irgendeinem Grund und der Ausgang

[[2.0, 2.0, 2.0, 2.0, 2.0], [2.0, 2.0, 2.0, 2.0, 2.0]...] 

perms = [] 
for c1 in coins: 
    for c2 in coins: 
     for c3 in coins: 
      for c4 in coins: 
       for c5 in coins: 
        if c1+c2+c3+c4+c5 == 2: 
         print c1,c2,c3,c4,c5 
         perms.append([c1,c2,c3,c4,c5]) 


print perms 

jedoch ist, diese funktioniert, und der Ausgang ist

[[0.1, 0.2, 0.2, 0.5, 1.0], [0.1, 0.2, 0.2, 1.0, 0.5], [0.1, 0.2, 0.5, 0.2, 1.0],[0.1, 0.2, 0.5, 1.0, 0.2], [0.1, 0.2, 1.0, 0.2, 0.5], [0.1, 0.2, 1.0, 0.5, 0.2],[0.1, 0.5, 0.2, 0.2, 1.0], [0.1, 0.5, 0.2, 1.0, 0.2]...] 

Was ist der Unterschied zwischen den beiden ist ?

Und auch, wie kann ich meinen Code, vielleicht eine rekursive Funktion verkürzen? Damit statt c1 in Münzen, c2 in Münzen usw., ich habe nur ein oder zwei Schleifen, um die gleiche Arbeit zu tun.

+1

* "Vielleicht eine rekursive Funktion?" * Ja, das wäre hier besser. – jDo

Antwort

1

Das Problem ist, dass c wird immer noch geändert nach es wurde perms hinzugefügt. Sie können stattdessen eine Kopie an check übergeben, dann scheint es zu funktionieren.

c = [0] * 5 
for c[0] in coins: 
    for c[1] in coins: 
     for c[2] in coins: 
      for c[3] in coins: 
       for c[4] in coins: 
        check(c[:]) # c[:] creates a copy of c 

BTW, ich habe nicht einmal wissen for c[1] in coins gültige Python-Syntax ist ...

Auch Sie vielleicht einen Blick auf itertools haben wollen, besonders product, permutations, combinations und combinations_with_replacement.


Eine rekursive Funktion könnte in etwa so aussehen:

def comb(current, target): 
    if sum(current) == target: 
     yield current 
    elif sum(current) < target: 
     for coin in coins: 
      for solution in comb(current + [coin], target): 
       yield solution 

jedoch auch dies zu langsam zu sein scheint für alle Kombinationen von Münzen zu bekommen.

+0

Danke. Und, irgendwelche Ideen, wie man eine rekursive Funktion implementiert, um das gleiche Problem zu lösen? Ich bin schrecklich in Rekursion tbh .. – SinByCos

+0

Gah, Generatoren + Rekursion macht mich wirklich verrückt D: Hoffentlich werde ich das bald verstehen, aber danke! – SinByCos

1

@tobias_k zeigt an, Sie in diesem Fall combinations_with_replacement mit permutations von itertools verwenden:

coins = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0] 
perms = set() # invariant no repeated elements, 

# return elements with length=5 repeat 
combinations = combinations_with_replacement(coins,5) 

for comb in combinations: 
    for c1,c2,c3,c4,c5 in permutations(comb): 
     if sum([c1,c2,c3,c4,c5]) == 2: 
      perms.add((c1,c2,c3,c4,c5)) 

HINWEIS: Wenn Sie eine Liste in diesem Fall benutzen sollte wiederholt werden beseitigt oder prüft in einer anderen Art und Weise.

Verwandte Themen