[PYTHON] Versuchen Sie, sich der Teilsumme zu stellen

Guten Abend. Es ist lange her (* ´ω `)

Diese Herausforderung stammt aus einem Array, das beliebige Elemente enthält Wählen Sie Elemente nach dem Zufallsprinzip aus und addieren Sie sie. Es geht aber nicht nur ums Aufsummieren Es muss addiert werden, um den Zielwert zu erreichen.

Wählen Sie zum Beispiel eine Kombination aus dem Array, so dass die Summe 20 ist !! Es ist so etwas.

Etwas (; ´ ・ ω ・)

Es scheint ziemlich berühmt und grundlegender Inhalt zu sein, Ich persönlich hatte es schwer (lacht)

Plötzlich, Ich werde den Code setzen.

Partial_sum.py


def solve(Nlist, target,  i=0, sum=0):
    if i == len(Nlist):
        return sum == target
    if (solve(Nlist, target, i + 1, sum)):
        return True
    if (solve(Nlist, target, i + 1, sum + Nlist[i])):
        return True
    return False

Nlist = [1,3,5,12,7]
target = 11
print(solve(Nlist, target))

Es ist einfacher als Sie denken, aber es ist kompliziert. Zum Beispiel, Zuerst werde ich nur hier schauen.

Partial_sum.py


#Beginnen Sie hier!! 
Nlist = [1,3,5,12,7]
target = 11
#          ↓[1,3,4...] ↓ 11
print(solve(Nlist, target))

Wirf Nlist und ziele auf lösen. Als Bild ein Array mit Elementen und einem Zielgesamtwert Wirf einfach das Ganze und sag hallo !! Werfen wir einen Blick hinein zu lösen.

Partial_sum.py


#Ich bin ein Bild von Ihrem aktuellen Standort.
#Summe ist die Summe der aktuellen Zahlen.
#Sie sind bei 0,Der Gesamtwert ist ebenfalls 0
def solve(Nlist, target,  i=0, sum=0):
    #Nlist ist 5 in der Länge, anfangs i==Da es 0 ist, Pass!!
    if i == len(Nlist):
        return sum == target
    #Das?!Es gibt auch eine Lösung in der if-Anweisung. Ich weiß es nicht!!
    #Hören wir auf zu lesen(Lol)
    if (solve(Nlist, target, i + 1, sum)):

Ich weiß nicht, ich will es rauswerfen (lacht).

Nein! Lauf weg. .. Die Antwort lautet: Wenn Ihre if-Anweisung eine Rekursion enthält, Es durchläuft den rekursiven Prozess und leitet wahr oder falsch ab. Dies bestimmt, ob es in der if-Anweisung enthalten ist oder nicht. Hmm, dumm (lacht)

Möchtest du vorerst gehen? Von lösen (Nlist, Ziel, i + 1, Summe) in if Für ein Abenteuer, um herauszufinden, was vor uns liegt.

Lass uns in der Reihenfolge (`) ノ gehen

i=0.py


def solve(Nlist, target,  i=0, sum=0):
    #pass!
    if i == len(Nlist):
        return sum == target
    #Die rekursive Verarbeitung wird fortgesetzt, bis die bedingte Anweisung der if-Anweisung entweder True oder False ist.
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=1.py


#solve(Nlist,target,1(=0+1),0)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=1, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Es ist auch ein rekursiver Prozess. Lass uns ohne Angst gehen!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=2.py


#solve(Nlist,target,2(=1+1),0)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=2, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Es ist auch ein rekursiver Prozess. Lass uns ohne Angst gehen!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=3.py


#solve(Nlist,target,3(=2+1),0)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=3, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Es ist auch ein rekursiver Prozess. Lass uns ohne Angst gehen!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=4.py


#solve(Nlist,target,4(=3+1),0)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=4, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Es ist auch ein rekursiver Prozess. Lass uns ohne Angst gehen!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=5.py


#solve(Nlist,target,5(=4+1),0)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=5, sum=0):
    #i == len(Nlist) ==Schließlich habe ich es in 5 in die if-Anweisung am Anfang eingefügt.
    if i == len(Nlist):
        #Aber leider Summe(0) != target(11)。False
        return sum == target

Ich verstehe, ich bin zu i = 5 gegangen, aber es hat sich als falsch herausgestellt. Was passiert danach? .. Das Ergebnis von i = 5 war vorerst False Nehmen wir es zurück zur vorherigen Ebene, i = 4.

i=4.py


def solve(Nlist, target,  i=4, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Die bedingte Aussage in if-Minuten war Flase. Das heißt, die if-Anweisung hier ist bestanden!!
    #Gehen wir zur nächsten if-Anweisung!!
    if (solve(Nlist, target, i + 1, sum)):
        return True
    #Hier ich=4 Also lasst uns ersetzen
    #  (solve(Nlist, target, 4 + 1, sum + Nlist[4]))
    #  (solve(Nlist, target,   5  , 0   + 7        ) //Nlist = [1,3,5,12,7]
    if (solve(Nlist, target, i + 1, sum + Nlist[i])):
        return True

Ja, fahren Sie mit der nächsten if-Anweisung fort. Lassen Sie uns noch einmal überprüfen, ob i = 5 ist, mit einer neuen bedingten Anweisung.

i=5.py


#solve(Nlist,target,5,7)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=5, sum=7):
    #i == len(Nlist) == 5 ,Fügen Sie es in die if-Anweisung ein.
    if i == len(Nlist):
        #Aber leider Summe(7) != target(11)。False
        return sum == target

Ich denke, dass die Abbildung bis zu diesem Punkt wie die folgende aussehen wird. 図2.PNG Ein guter Mensch kann dies mit seinem Kopf tun, Ich konnte es nicht selbst machen, also schrieb ich es auf Papier und organisierte es. Zurück zur Geschichte, es scheint, dass nichts getan wurde, bis i = 4. Lassen Sie uns dieses Ergebnis nun an i = 3 melden.

i=3.py


#solve(Nlist,target,3(=2+1),0)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=3, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Falsch also pass!! 
    #Die Summe war noch nie 11 aus der vorherigen Verarbeitung
    if (solve(Nlist, target, i + 1, sum)):
        return True
    #  (solve(Nlist, target, 3 + 1, sum + Nlist[3])): //Nlist = [1,3,5,12,7]
    #  (solve(Nlist, target,   4  ,  0  +    12   )):
    #Ersetzen Sie die folgenden Bedingungen und geben Sie ein neues if ein!!                 
    if (solve(Nlist, target, i + 1, sum + Nlist[i])):
        return True

i=4.py


#solve(Nlist,target,4(=3+1),12)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=4, sum=12):
    #pass!!
    if i == len(Nlist):
        return sum == target

    #Es ist ein rekursiver Prozess. Lass uns ohne Angst gehen!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=5.py


#solve(Nlist,target,5(=4+1),12)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=5, sum=12):
    #i == len(Nlist) == 5 ,Fügen Sie es in die if-Anweisung ein.
    if i == len(Nlist):
        #Aber leider Summe(12) != target(11)。False
        return sum == target

Es war falsch, ich werde einen Bericht zurückgehen.

i=4.py


#solve(Nlist,target,4(=3+1),12)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=4, sum=12):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Falsch mit Pass!
    if (solve(Nlist, target, i + 1, sum)):
        return True
    #Next↓
    if (solve(Nlist, target, i + 1, sum + Nlist[i]))://Nlist = [1,3,5,12,7]
        return True

i=5.py


#solve(Nlist,target,5(=4+1),12 + 7)Ich bin in den rekursiven Prozess eingetreten.
def solve(Nlist, target,  i=5, sum=19):
    #i == len(Nlist) == 5 ,Fügen Sie es in die if-Anweisung ein.
    if i == len(Nlist):
        #Aber leider Summe(19) != target(11)。False
        return sum == target

Machen wir eine Figur. 図3.PNG Ich möchte die Holzstruktur sehen (lacht) Es ist eine lange Aufgabe, aber es ist in Ordnung, wenn Sie die folgenden Punkte beachten.

** 1. Verfolgen Sie die bedingte Anweisung (rekursiv) der if-Anweisung so lange, bis True und False angezeigt werden. 2. Wenn Wahr oder Falsch angezeigt wird, kehren Sie zur vorherigen Ebene zurück und folgen Sie der Operation genau gemäß der Beschreibung in Lösung **

Ich habe es brillant geschrieben, aber ich wusste es überhaupt nicht Um zu sehen, was sich ändert Ich mischte Pirnt wie folgt.

Partial_sum.py


def solve(Nlist, target,  i=0, sum=0):
    print(f"i:{i},sum:{sum}") #Zeigen Sie den aktuellen Wert zur besseren Übersicht während der rekursiven Verarbeitung an
    if i == len(Nlist):
        #Fügen Sie für die rekursive Verarbeitung die bedingte Anweisung ein, wenn Sie am Anfang zur untersten Ebene kommen.
        #Drucken Sie also den Kommentar aus, den Sie kennen, wenn Sie diese if-Anweisung eingeben
        print(f"Result:i={i},sum={sum}") 
        print() #Zeilenumbrüche, um vom nächsten Prozess zu trennen
        return sum == target
    if (solve(Nlist, target, i + 1, sum)):
        return True
    if (solve(Nlist, target, i + 1, sum + Nlist[i])):
        return True
    return False

Nlist = [1,3,5,12,7]
target = 11
print(solve(Nlist, target))

Mal sehen, das Ausführungsergebnis !!

Ausführungsergebnis.py


i:0,sum:0
i:1,sum:0
i:2,sum:0
i:3,sum:0
i:4,sum:0
i:5,sum:0
Result:i=5,sum=0
#↑ Vergleiche mit der obigen Abbildung. ich,Entspricht die Änderung der Summe nicht der Zahl?
#Result:i=5,sum=Gibt False zurück, da die Summe nicht 11 ist, da 0 steht
#Ich nach der Rückkehr=Ich bin um 4 zurück.
#Fahren Sie nach der Rückkehr mit der nächsten IF-Anweisung fort.
#Daher ist die nächste Anzeige unten=Es wird zum Zeitpunkt von 5 pirnt.
#Wenn Sie nicht verstehen, kehren Sie bitte zur obigen Seite zurück.
i:5,sum:7
Result:i=5,sum=7
#↑sum(=7) !=Da es 11 ist, ist es falsch.
#Deshalb habe ich=Die beiden if-Anweisungen bei 4 sind beide False.
#Als nächstes ist ich=Es kehrt zum Zeitpunkt 3 zur if-Anweisung zurück, die Verarbeitung ist jedoch dieselbe wie oben.
i:4,sum:12
i:5,sum:12
Result:i=5,sum=12

i:5,sum:19
Result:i=5,sum=19

i:3,sum:5
i:4,sum:5
i:5,sum:5
Result:i=5,sum=5

i:5,sum:12
Result:i=5,sum=12

i:4,sum:17
i:5,sum:17
Result:i=5,sum=17

i:5,sum:24
Result:i=5,sum=24

i:2,sum:3
i:3,sum:3
i:4,sum:3
i:5,sum:3
Result:i=5,sum=3

i:5,sum:10
Result:i=5,sum=10

i:4,sum:15
i:5,sum:15
Result:i=5,sum=15

i:5,sum:22
Result:i=5,sum=22

i:3,sum:8
i:4,sum:8
i:5,sum:8
Result:i=5,sum=8

i:5,sum:15
Result:i=5,sum=15

i:4,sum:20
i:5,sum:20
Result:i=5,sum=20

i:5,sum:27
Result:i=5,sum=27

i:1,sum:1
i:2,sum:1
i:3,sum:1
i:4,sum:1
i:5,sum:1
Result:i=5,sum=1

i:5,sum:8
Result:i=5,sum=8

i:4,sum:13
i:5,sum:13
Result:i=5,sum=13

i:5,sum:20
Result:i=5,sum=20

i:3,sum:6
i:4,sum:6
i:5,sum:6
Result:i=5,sum=6

i:5,sum:13
Result:i=5,sum=13

i:4,sum:18
i:5,sum:18
Result:i=5,sum=18

i:5,sum:25
Result:i=5,sum=25

i:2,sum:4
i:3,sum:4
i:4,sum:4
i:5,sum:4
Result:i=5,sum=4

i:5,sum:11
Result:i=5,sum=11

True

Wie oben erwähnt, nach Erreichen der Grenze, wo ein Übergang nicht möglich ist Die Methode zum Wiederholen des Vorgangs, einen Schritt zurückzugeben und bis zur Grenze zu arbeiten, wird als ** Tiefenprioritätssuche ** bezeichnet. Das Material sagt, dass es relativ einfach zu schreiben ist, Nein, es ist großartig für Anfänger !! (゚ Д ゚)

Es scheint, dass die Zukunft noch lang ist (* ´ω `)

Recommended Posts

Versuchen Sie, sich der Teilsumme zu stellen
Versuchen Sie, das Thema Pelican vorzustellen
Probieren Sie Cython in kürzester Zeit aus
Der schnellste Weg, EfficientNet auszuprobieren
Der einfachste Weg, PyQtGraph auszuprobieren
Der Versuch, Segmentbäume Schritt für Schritt zu implementieren und zu verstehen (Python)
Versuchen Sie, das Triplett des Bootsrennens vorherzusagen, indem Sie das Lernen bewerten
Probieren Sie die Microsoft Cognitive Services Face-API aus
Python Amateur versucht die Liste zusammenzufassen ①
Versuchen Sie, O'Reillys Bücher durch Clustering zu klassifizieren
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Versuchen Sie, dem Bild die Verzerrung des Fischaugenobjektivs hinzuzufügen
Versuchen Sie, den Strombedarf durch maschinelles Lernen vorherzusagen
Versuchen Sie, die Daimyo-Prozession in Tucker zu zerlegen
Versuchen Sie, das Problem der Python-Klassenvererbung zu lösen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
So löschen Sie die von Python ausgegebenen Zeichen
Laden Sie den VGG Face2-Datensatz direkt auf den Server herunter
Versuchen Sie, die Bewegung des Sonnensystems zu simulieren
Versuchen Sie zum ersten Mal, in Qiita zu posten
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (② Registrieren Sie die Umgebung im Fitnessstudio).
Laden Sie das durch Anfragen heruntergeladene Bild direkt in S3 hoch
[Python] Versuchen Sie, die coole Antwort auf das FizzBuzz-Problem zu lesen
Versuchen Sie, NETCONF (ncclient) von der Software zum Router einzustellen
Versuchen Sie, die Probleme des "Matrix-Programmierers" zu lösen (Kapitel 1).
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Molekulardynamiksimulation vorerst versuchen
Speichern Sie das von pyqtgraph gezeichnete Diagramm in einem Bild
Versuchen Sie, die Anzahl der Likes auf Twitter zu schätzen
Lesen Sie die XML-Datei anhand des Python-Tutorials
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
[Neo4J] ④ Versuchen Sie, die Diagrammstruktur mit Cypher zu handhaben
So finden Sie heraus, welche Version von Java Maven verwendet wird
Versuchen Sie, die in Firefox gespeicherten Anmeldedaten zu entschlüsseln
So heben Sie den von pytest-django verwendeten DB-Namen auf
Versuchen Sie, die Schritte umzugestalten
Versuchen Sie, yolact zu implementieren
Der Weg nach Pythonista
Der Weg nach Djangoist
Versuchen Sie, in die Datenbank zu importieren, indem Sie ShapeFile mit numerischen Informationen zum nationalen Land mit Python bearbeiten
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Versuchen Sie, mit dem Uprobe zu spielen, der Systemtap direkt unterstützt
Ich möchte die von LINE an S3 gesendeten Fotos speichern
Versuchen Sie, über XML RPC eine Verbindung zu Supervisord herzustellen, um das Programm zu starten / zu stoppen
So wechseln Sie die Konfigurationsdatei, die von Python gelesen werden soll
So testen Sie die Attribute, die durch add_request_method of pyramid hinzugefügt wurden
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
[Django] Übergeben Sie die von der API authentifizierte Benutzerinstanz an ModelSerializer
Versuchen Sie, die Genauigkeit der Twitter-ähnlichen Zahlenschätzung zu verbessern
[Python] Versuchen Sie, Ramen-Shops durch Verarbeitung natürlicher Sprache zu klassifizieren
Versuchen Sie, die Probleme / Probleme des "Matrix-Programmierers" zu lösen (Kapitel 0-Funktion)
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Erstellen Sie eine KI, die Zuckerbergs Gesicht mit tiefem Lernen identifiziert learning (Datenlernen)
Anhängen an den Python-Prozess des SSH-Ziels und Debuggen
Versuchen Sie, die in COTOHA beliebten Schlüsselwörter zu extrahieren
Versuchen Sie, eine multimodale Verteilung mithilfe des EM-Algorithmus zu modellieren