IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Arguments d'une fonction r�cursive pass�s en param�tres.


Sujet :

Python

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Ing�nieur
    Inscrit en
    Mai 2019
    Messages
    1
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Ing�nieur
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2019
    Messages : 1
    Par d�faut Arguments d'une fonction r�cursive pass�s en param�tres.
    Bonjour,
    Je suis nouveau sur le forum, et j'ai une question � laquelle je n'ai pas trouv� de r�ponse. Je m'int�resse � un programme qui impl�mente l'algorithme de Dijsktra, que j'aimerais comprendre, notamment dans la fa�on dont celui-ci est appel� :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    def dijkstra(graph,position,dest,visited=[],distances={},predecessors={}):
    et l'appel r�cursif suivant:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    dijkstra(graph,min(unvisited, key=unvisited.get),dest,visited,distances,predecessors)
    Ma question est comment est-il possible que l'appel � cette fonction fonctionne correctement avec le passage de 3 param�tres (graph, position,dest), alors que 6 param�tres sont d�finis pour la fonction.
    Merci d'avance.

    Peter_M31.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Wed May  8 13:41:17 2019
    """
     
    def dijkstra(graph,position,dest,visited=[],distances={},predecessors={}):
     
        print("graph :",graph)
     
        # On verifie si les 2 points sont dans notre réseau
        if position not in graph:
            print('Le point de départ n\'existe pas.')
     
        if dest not in graph:
            print('Le point d\'arrivée n\'existe pas.')    
     
        if position != dest:
            # On commence en mettant le point de départ à 0
            if not visited: 
                distances[position]=0
            # Puis nous visitons les points voisins pour calculer leurs distances 
            for neighbor in graph[position]:
                if neighbor not in visited:
                    new_distance = distances[position] + graph[position][neighbor]
                    if new_distance < distances.get(neighbor,float('inf')):
                        distances[neighbor] = new_distance
                        predecessors[neighbor] = position
            # On marque les points voisins comme étant visités
            visited.append(position)
            # Maintenant que les points voisins sont visités, on choisit le prochain point avec le poids le plus bas.
            unvisited={}   
     
            for p in graph:
                if p not in visited:
                    unvisited[p] = distances.get(p,float('inf'))        
            dijkstra(graph,min(unvisited, key=unvisited.get),dest,visited,distances,predecessors)
        else :
            # Maintenant que tous les points dans le réseau sont visités, on obtient le chemin 
            path=[]
            pred=dest
            while pred != None:
                path.append(pred)
                pred=predecessors.get(pred,None)
            print('Le chemin le plus court (reste a mettre a l\'envers) : '+str(path)+" avec une distance de "+str(distances[dest]))
     
     
     
    start = input('Point de départ : ').lower()
    dest = input ('Point d\'arrivé : ').lower()
    # Le réseau est donné sous la forme de "graph"
    graph = {
            "a":{"b":2,"c":5},
            "b":{"e":2},
            "c":{"e":1,"b":2},
            "d":{"c":4,"b":1},
            "e":{"f":2,"d":4},
            "f":{"d":1}
            }
    dijkstra(graph,start,dest)

  2. #2
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 772
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activit� : Architecte technique retrait�
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par d�faut
    Salut,

    Citation Envoy� par Peter_M31 Voir le message
    Ma question est comment est-il possible que l'appel � cette fonction fonctionne correctement avec le passage de 3 param�tres (graph, position,dest), alors que 6 param�tres sont d�finis pour la fonction.
    Parce qu'on a d�finit une valeur par d�faut aux param�tres qu'on peut omettre.
    (mais comme il s'agit de mutables... c'est "dangereux" et plut�t ici, juste une fioriture pour dire qu'on n'utilise pas de variables globales alors qu'on se repasse le m�me objet).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre chevronn�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par d�faut
    Bonjour,

    La fonction est appel�e avec seulement 3 param�tres sur 6 car les 3 derniers ont une valeur par d�faut.
    Par contre, il vaudrait mieux utiliser 'None' comme valeur par d�faut et tester les param�tres dans le corps de la fonction:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    def mafonction(param_obligatoire, param_avec_defaut=None):
      if param_avec_defaut is None:
        param_avec_defaut = {}
      ....

Discussions similaires

  1. probl�me d'une valeur de param�tre dans une fonction r�cursive
    Par xavier-Pierre dans le forum G�n�ral Python
    R�ponses: 7
    Dernier message: 05/01/2017, 12h36
  2. R�ponses: 11
    Dernier message: 01/02/2011, 15h20
  3. premier argument d'une fonction
    Par Ickou dans le forum Langage
    R�ponses: 3
    Dernier message: 10/09/2005, 14h17
  4. une url comme argument d'une fonction
    Par khayyam90 dans le forum G�n�ral JavaScript
    R�ponses: 3
    Dernier message: 18/10/2004, 20h15
  5. passer FILE* en argument d une fonction
    Par Monsieur_Manu dans le forum C
    R�ponses: 9
    Dernier message: 10/04/2003, 17h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo