1
votes

Pourquoi cette fonction récursive ne traite-t-elle pas la liste entière?

Quelqu'un peut-il me dire ce qui ne va pas avec le code que j'écris? J'essaie de trouver une somme de tous les éléments de cette liste. Mon code:

def determine_sum(m_list, sum_count): 

    for i in range(len(m_list)): 

        if isinstance(m_list[i], int):      
            sum_count += m_list[i]  


        else:  
            return determine_sum(m_list[i], sum_count)

    return sum_count 

m_list = [1, 2, 3, [4, 5], [4, [3,4]] ]

print(determine_sum(m_list, 0))

Le résultat est 15 , mais je m'attendais à 26.


1 commentaires

Astuce: une boucle for ... in range (): où les nombres ne sont utilisés que pour indexer certains objets doit être simplifiée en for ... in ...: .


3 Réponses :


2
votes
def determine_sum(m_list, sum_count): 

    for i in range(len(m_list)): 

        if isinstance(m_list[i], int):      
            sum_count += m_list[i]  

        else:
            # Don't return here, just add the count and keep looping
            sum_count = determine_sum(m_list[i], sum_count)

    return sum_count 


2 commentaires

Cela renvoie le nombre 78, qui n'est pas une somme des éléments de la liste.


Corrigé, nécessaire =, pas + =



1
votes

Obtention de la somme de la liste d'exemples: 26

Il vous manquait pour ajouter la sortie de la somme de déterminer imbriquée dans le sum_count.

def determine_sum(m_list, sum_count): 

    for i in range(len(m_list)): 
        if isinstance(m_list[i], int):      
            print(m_list[i])
            sum_count += m_list[i]  
        else:  
            sum_count = determine_sum(m_list[i], sum_count)
    return sum_count 

m_list = [1, 2, 3, [4, 5], [4, [3,4]] ]

print("Sum:", determine_sum(m_list, 0)) # 26


0 commentaires

0
votes

Le principal problème avec votre code est cette ligne:

            sum_count = determine_sum(m_list[i], sum_count)

Si vous rencontrez une autre liste, vous appelez determine_sum de manière récursive, ce qui calcule la somme des sous -list et commence par un nombre de sum_count . Cependant, quel que soit le résultat de la première sous-liste, c'est le résultat total que vous renvoyez. Votre fonction ignore les listes suivantes, car return termine la fonction.

Une fonction récursive comme celle-ci n'a pas besoin de passer sum_count . Au lieu de cela, vous pouvez simplement calculer la somme d'une sous-liste de manière récursive, puis ajouter le résultat à la somme actuelle, en continuant la boucle. Chaque appel de determine_sum obtiendra sa propre copie de la somme en cours, vous n'avez donc pas besoin de la transmettre.

Comme ceci:

def determine_sum(m_list): 
    sum_count = 0

    for i in range(len(m_list)): 
        if isinstance(m_list[i], int):      
            sum_count += m_list[i]  
        else:  
            sum_count += determine_sum(m_list[i])

    return sum_count 

m_list = [1, 2, 3, [4, 5], [4, [3,4]] ]

print(determine_sum(m_list))


1 commentaires

Heureux de l'entendre @SebastienBoulas - vous devriez probablement accepter la réponse qui vous a le plus aidé comme réponse à votre question, afin qu'elle ne soit plus marquée comme sans réponse.