[PYTHON] Essayez de faire face à la somme partielle

Bonsoir. Ça fait longtemps (* ´ω `)

Ce défi provient d'un tableau contenant des éléments arbitraires Sélectionnez des éléments au hasard et ajoutez-les ensemble. Mais il ne s'agit pas seulement d'additionner Il doit être additionné pour atteindre la valeur cible.

Par exemple, choisissez une combinaison dans le tableau pour que le total soit de 20 !! C'est quelque chose comme ça.

Un peu (; ´ ・ ω ・)

Cela semble être un contenu assez célèbre et basique, J'ai personnellement eu du mal (rires)

Tout à coup, Je vais mettre le code.

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))

C'est plus simple que vous ne le pensez, mais c'est compliqué. Par exemple, Au début, je ne regarderai qu'ici.

Partial_sum.py


#Commencez d'ici!! 
Nlist = [1,3,5,12,7]
target = 11
#          ↓[1,3,4...] ↓ 11
print(solve(Nlist, target))

Lancez Nlist et ciblez dans la résolution. En tant qu'image, un tableau contenant des éléments et une valeur totale cible Jetez le tout et dites bonjour !! Jetons un coup d'œil à l'intérieur de résoudre.

Partial_sum.py


#i est une image de votre emplacement actuel.
#sum est la somme des nombres actuels.
#Vous êtes à 0,La valeur totale est également 0
def solve(Nlist, target,  i=0, sum=0):
    #Nlist est de 5 de longueur, initialement je==Puisqu'il est 0, passe!!
    if i == len(Nlist):
        return sum == target
    #cette?!Il y a aussi résoudre dans l'instruction if. Je ne sais pas!!
    #Arrêtons de lire(Lol)
    if (solve(Nlist, target, i + 1, sum)):

Je ne sais pas, je veux le jeter (rires).

Non, fuyez. .. La réponse est que si vous avez une récursivité dans votre instruction if, Terminez le processus récursif et dérivez vrai ou faux. Cela détermine s'il est inclus ou non dans l'instruction if. Hmm, stupide (rires)

Voulez-vous partir pour le moment? De résoudre (Nliste, cible, i + 1, somme) dans si Pour une aventure pour découvrir ce qui nous attend.

Allons-y dans l'ordre (`) ノ

i=0.py


def solve(Nlist, target,  i=0, sum=0):
    #pass!
    if i == len(Nlist):
        return sum == target
    #Le traitement récursif se poursuit jusqu'à ce que l'instruction conditionnelle de l'instruction if soit True ou False.
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=1.py


#solve(Nlist,target,1(=0+1),0)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=1, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #C'est aussi un processus récursif. Allons-y sans crainte!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=2.py


#solve(Nlist,target,2(=1+1),0)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=2, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #C'est aussi un processus récursif. Allons-y sans crainte!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=3.py


#solve(Nlist,target,3(=2+1),0)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=3, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #C'est aussi un processus récursif. Allons-y sans crainte!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=4.py


#solve(Nlist,target,4(=3+1),0)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=4, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #C'est aussi un processus récursif. Allons-y sans crainte!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=5.py


#solve(Nlist,target,5(=4+1),0)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=5, sum=0):
    #i == len(Nlist) ==Enfin en 5, je l'ai mis dans l'instruction if au début.
    if i == len(Nlist):
        #Mais malheureusement somme(0) != target(11)。False
        return sum == target

Je vois, je suis allé à i = 5, mais il s'est avéré être faux. Que se passe-t-il ensuite? .. Pour le moment, le résultat de i = 5 était Faux, donc Revenons à la couche précédente, i = 4.

i=4.py


def solve(Nlist, target,  i=4, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #L'instruction conditionnelle dans if minutes était Flase. Autrement dit, la déclaration if ici est passée!!
    #Passons à la prochaine instruction if!!
    if (solve(Nlist, target, i + 1, sum)):
        return True
    #Ici je=4 alors remplaçons
    #  (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

Oui, passez à l'instruction if suivante. Vérifions à nouveau quand i = 5 avec une nouvelle instruction conditionnelle.

i=5.py


#solve(Nlist,target,5,7)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=5, sum=7):
    #i == len(Nlist) == 5 ,Mettez-le dans l'instruction if.
    if i == len(Nlist):
        #Mais malheureusement somme(7) != target(11)。False
        return sum == target

Je pense que le chiffre jusqu'à présent ressemblera à celui ci-dessous. 図2.PNG Une bonne personne peut faire ça avec sa tête, Je ne pouvais pas le faire moi-même, alors je l'ai écrit sur papier et je l'ai organisé. Pour en revenir à l'histoire, il semble que rien ne pourrait être fait tant que i = 4. Rapportons maintenant ce résultat à i = 3.

i=3.py


#solve(Nlist,target,3(=2+1),0)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=3, sum=0):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Faux alors passe!! 
    #La somme n'a jamais été 11 du traitement précédent
    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   )):
    #Remplacez les conditions ci-dessous et entrez un nouveau si!!                 
    if (solve(Nlist, target, i + 1, sum + Nlist[i])):
        return True

i=4.py


#solve(Nlist,target,4(=3+1),12)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=4, sum=12):
    #pass!!
    if i == len(Nlist):
        return sum == target

    #C'est un processus récursif. Allons-y sans crainte!!
    if (solve(Nlist, target, i + 1, sum)):
        return True

i=5.py


#solve(Nlist,target,5(=4+1),12)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=5, sum=12):
    #i == len(Nlist) == 5 ,Mettez-le dans l'instruction if.
    if i == len(Nlist):
        #Mais malheureusement somme(12) != target(11)。False
        return sum == target

C'était faux, je reviendrai sur un rapport.

i=4.py


#solve(Nlist,target,4(=3+1),12)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=4, sum=12):
    #pass!!
    if i == len(Nlist):
        return sum == target
    #Faux avec 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)Je suis entré dans le processus récursif.
def solve(Nlist, target,  i=5, sum=19):
    #i == len(Nlist) == 5 ,Mettez-le dans l'instruction if.
    if i == len(Nlist):
        #Mais malheureusement somme(19) != target(11)。False
        return sum == target

Faisons une figure. 図3.PNG Je veux voir la structure en bois (rires) C'est une tâche longue, mais ce n'est pas grave si vous gardez à l'esprit les points suivants.

** 1. Continuez à courir après l'instruction conditionnelle (récursive) de l'instruction if jusqu'à ce que vous voyiez True, False 2. Lorsque Vrai ou Faux est vu, revenez à la couche précédente et suivez fidèlement l'opération selon la description dans résoudre **

Je l'ai écrit avec brio, mais je ne le savais pas du tout, alors Pour voir ce qui change J'ai mixé pirnt comme suit.

Partial_sum.py


def solve(Nlist, target,  i=0, sum=0):
    print(f"i:{i},sum:{sum}") #Afficher la valeur actuelle pour plus de clarté pendant le traitement récursif
    if i == len(Nlist):
        #Pour le traitement récursif, mettez l'instruction conditionnelle lorsque vous arrivez à la couche inférieure au début.
        #Alors, imprimez le commentaire que vous connaissez lorsque vous entrez cette instruction if est la couche inférieure
        print(f"Result:i={i},sum={sum}") 
        print() #Sauts de ligne pour se séparer du processus suivant
        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))

Voyons le résultat de l'exécution !!

Résultat d'exécution.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
#↑ Comparez avec la figure ci-dessus. je,Le changement de somme ne correspond-il pas au chiffre?
#Result:i=5,sum=Renvoie False car la somme n'est pas 11 comme elle dit 0
#Je après le retour=Je serai de retour à 4 heures.
#Après le retour, passez à l'instruction IF suivante.
#Par conséquent, l'affichage suivant est i ci-dessous=Il devient pirnt au moment de 5.
#Si vous ne comprenez pas, veuillez retourner à la page ci-dessus.
i:5,sum:7
Result:i=5,sum=7
#↑sum(=7) !=Puisqu'il est 11, c'est faux.
#Donc, je=Les deux instructions if à 4 sont toutes les deux fausses.
#Ensuite, je=Il revient à l'instruction if au moment de 3, mais le traitement est le même que ci-dessus.
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

Comme mentionné ci-dessus, après avoir atteint la limite où la transition n'est pas possible La méthode de répétition du processus de retour d'une étape et d'opération à la limite est appelée ** recherche de priorité de profondeur **. Le matériel dit qu'il est relativement facile d'écrire, Non, c'est génial pour les débutants !! (゚ Д ゚)

Il semble que l'avenir soit encore long (* ´ω `)

Recommended Posts

Essayez de faire face à la somme partielle
Essayez d'introduire le thème sur Pelican
Essayez Cython dans les plus brefs délais
Le moyen le plus rapide d'essayer EfficientNet
La façon la plus simple d'essayer PyQtGraph
Essayer d'implémenter et de comprendre les arborescences de segments étape par étape (python)
Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage
Essayez l'API de visage de Microsoft Cognitive Services
Python amateur tente de résumer la liste ①
Essayez de classer les livres d'O'Reilly en les regroupant
Essayez de résoudre le problème du fizzbuzz avec Keras
Essayez d'ajouter la distorsion de l'objectif fisheye à l'image
Essayez de prédire la demande de puissance par l'apprentissage automatique
Essayez de décomposer la procession du daimyo en Tucker
Essayez de résoudre le problème de l'héritage de classe Python
Essayez de résoudre le diagramme homme-machine avec Python
Comment essayer l'algorithme des amis d'amis avec pyfof
Comment effacer les caractères générés par Python
Téléchargez le jeu de données VGG Face2 directement sur le serveur
Essayez de simuler le mouvement du système solaire
Essayez de publier sur Qiita pour la première fois
Essayez de faire une stratégie de blackjack en renforçant l'apprentissage (② Enregistrer l'environnement dans le gymnase)
Téléchargez l'image téléchargée par requêtes directement vers S3
[Python] Essayez de lire la bonne réponse au problème FizzBuzz
Essayez de configurer NETCONF (ncclient) du logiciel au routeur
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (Chapitre 1)
Visualisons la pièce avec tarte aux râpes, partie 1
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Simulation de dynamique moléculaire à essayer pour le moment
Enregistrer le graphique dessiné par pyqtgraph dans une image
Essayez d'estimer le nombre de likes sur Twitter
Lisez le fichier xml en vous référant au didacticiel Python
Essayez d'obtenir le contenu de Word avec Golang
[Neo4J] ④ Essayez de gérer la structure du graphe avec Cypher
Comment savoir quelle version de Java Maven utilise
Essayez de déchiffrer les données de connexion stockées dans Firefox
Comment supprimer le préfixe du nom de base de données utilisé par pytest-django
Essayez de refactoriser tout en prenant des mesures
Essayez d'implémenter yolact
La route vers Pythonista
La route vers Djangoist
Essayez d'importer dans la base de données en manipulant ShapeFile d'informations numériques sur les terres nationales avec Python
Essayez d'obtenir la liste des fonctions du paquet Python> os
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Essayez de jouer avec l'uprobe qui prend directement en charge Systemtap
Je souhaite enregistrer les photos envoyées par LINE vers S3
Essayez de vous connecter à Supervisord via XML RPC pour démarrer / arrêter le programme
Comment changer le fichier de configuration pour qu'il soit lu par Python
Comment tester les attributs ajoutés par add_request_method de pyramid
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
[Django] Transmettez l'instance utilisateur authentifiée par l'API à ModelSerializer
Essayez d'améliorer la précision de l'estimation du nombre de Twitter
[Python] Essayez de classer les boutiques de ramen par traitement du langage naturel
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (fonction du chapitre 0)
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ③ (Apprentissage des données)
Attacher au processus Python de la destination SSH et déboguer
Essayez d'extraire les mots-clés populaires dans COTOHA
Essayez de modéliser une distribution multimodale à l'aide de l'algorithme EM