Return aui ne retourne pas

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

bonsoir chères amis. j’ai un petit souci par rapport a un return. j’ai développé une fonction récursive me permettant de savoir si un graphe contient un circuit. voici comment j’ai modélisé mon graphe:

1
dico = {"a": ["b", "c"], "b": ["d"], "c": [], "d": ["a"]}

j’ai un dictionnaire dans lequel les clés sont les noeuds du graphe et les valeurs sont les successeurs de ce nœud.

voici ma fonction :

1
2
3
4
5
6
7
8
9
def circuit(somtest, som, marq, dico):
    marq.append(som)
    for i in dico[som]:
        if i == somtest:
            print("entrer")
            return True
        if i not in marq:
            circuit(somtest, i, marq, dico)
    return False

Pour voir si il y a un circuit il suffit de partir d’un noeud et de voir si je peux revenir a ce même noeud.

Pour cela je vais essayer avec le noeud a.

j’exécute mon programme avec:

1
>>>circuit("a", "a", [], dico)

et voici le résultat qu’il me retourne:

1
2
entrer
False

On voit qu’on rentre dans le if du return True mais la fonction continue jusqu’à retourner False.

Du coup sa bouscule un peu mon entendement, je sais pas si c’est la récursivité que j’ai implémenté qui fait ça.

Aidez moi a bien comprendre ce processus, parce que je n’arrive pas comprendre.

Merci d’avance.

À la recherche de la connaissance.

+0 -0

Bon je suis sur mon ordi alors j’en profite pour développer un peu.

Essayons de programmer récursivement la fonction factorielle. Si tu ne connais pas, la factorielle de $n$, notée $n!$, vaut $1 \times 2 \times 3 \times \dots \times n-2 \times n-1 \times n$. On peut assez facilement remarquer que $n! = n \times (n-1)!$, ce que l’on va utiliser pour programmer notre fonction.

1
2
def fact(n):
    return n*fact(n-1)

Bon ça tu l’as compris il manque une condition d’arrêt qui sera $0! = 1$.

1
2
3
4
5
def fact(n):
    if n == 0:
        return 1
    else:
        return n*fact(n-1)

Rajoutons une condition pour n’accepter que les nombres positifs

1
2
3
4
5
6
7
def fact(n):
    if n == 0:
        return 1
    elif n > 0:
        return n*fact(n-1)
    else:
        except ValueError

Voila en gros ce qu’il faudrait faire 1. Or si je l’organise comme tu l’as fait pour ta fonction, j’écrirais

1
2
3
4
5
6
def fact(n):
    if n == 0:
        return 1
    elif n > 0:
        n*fact(n-1)
    except ValueError

Et du coup c’est normal que j’obtienne toujours une exception (à part pour fact(0)) puisque une fois fact(n-1) calculer, il n’y a aucune raison que la fonction s’arrête.

J’espère que ça t’aide :)


  1. à peu près, les pythonneux me reprocheraient sans doute beaucoup de chose. 

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0

Salut,

Juste une petite remarque, il faut utiliser raise et pas except. En effet, except sert à intercepter une exception, mais pas à en lever une. :)

Du coup, le code de la fonction devient :

1
2
3
4
5
6
7
def fact(n):
    if n == 0:
        return 1
    elif n > 0:
        return n * fact(n-1)
    else:
        raise ValueError

Merci wizix c’est ce que j’avais dis.Mais on fond le problème persiste toujours. Si tu as le temps je te pris d’essayer le code tu verras. Merci

melo96

C’est un des appels récursifs qui affiche « entrer ». Ce n’est pas parce qu’un sous-appel retourne True que l’appel parent retourne True aussi (et en l’occurrence ça n’arrive jamais ici).

Si tu en disais plus sur ce que doit réaliser ta fonction circuit, ce serait sûrement plus simple.

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte