0
votes

Pourquoi cette déclaration de retour a-t-elle une erreur dans cette fonction récursive Python?

Je pratique en utilisant des fonctions récursives en sommant tous les éléments d'une liste.

La fonction que j'ai faite était: xxx

Cette fonction jette cette erreur cependant: < / p>

TypeError: type (s) d'opérande non pris en charge pour +: 'int' et 'non constitué

J'ai trouvé la solution, rendant le cas de base renvoyer 0 au lieu de renvoyer .

Mais maintenant je suis curieux ce que le plain retourner était, ou n'était pas, faire pour lancer une erreur? Et pourquoi en Python, une langue assez flexible et qui pardonne, une telle chose est un problème?


4 commentaires

Être flexible et pardonné ne signifie pas que la langue devrait deviner ce que vous voulez. Retour sur son propre renvoi implicitement Aucun . C'est une règle de la langue


Il suffit de retourner des retours Aucun Alors, lorsque vous faites cette retour head + list_sum_recursive (INPUT_LIST) Vous ajoutez tête à Aucun Aucun lorsque le boîtier de base est atteint. C'est impardonnable parce que Python est une langue fortement dactylographiée, qui aide à éviter certains bugs qui se produiront si vous supposez Aucun devrait se convertir automatiquement à zéro ..


Tous les appels de fonction dans Python renvoient une valeur. Si un NARE est exécuté ou si l'exécution tombe de la fin de la fonction sans exécuter un retour , ils renvoient implicitement aucun . Il n'y a pas de concept de type "vide" qui donne une erreur si une tentative est faite de l'utiliser.


Merci pour la clarification. Je n'étais pas au courant d'une déclaration de retour nue avait un type de retour d'aucun.


3 Réponses :


0
votes

Comme indiqué dans les commentaires, n'en retournez pas dans la première section. Retour 0 à la place.

$ python test.py
6


0 commentaires

0
votes

Voulez-vous juste vous donner une version plus pythonique, j'espère que cela ne vous dérange pas.

def list_sum_recursive(input_list):

    #base case, list is empty
    if not input_list:
        return 0
    #return the sum of the head plus the sum of the rest of the list
    return input_list.pop(0) + list_sum_recursive(input_list)

print(list_sum_recursive([1,2,3]))


3 commentaires

Oui, j'aurais utilisé Input_List [0] + list_sum_recursive ([INPUT_LIST [1:]). Je me sens un peu inquiet de modifier la liste et de l'utiliser dans la même déclaration.


@DeePstop Ouais, la tranche ressemble à plus sûre et peut-être plus confortable pour plus de personnes.


J'aime à la fois la méthode Popping et Tranchement. Ce sont les types de choses que je dois commencer à rechercher dans mon code. C'est très propre



0
votes
def list_sum_recursive(input_list):

    #base case, list is empty
    if input_list == []:
        print("empty")
        return

    #recursive case
    else:
        #grab the first element
        head = input_list[0]
        del input_list[0]
        #return the sum of the head plus the sum of the rest of the list
        x=list_sum_recursive(input_list)
        if(x==None):
            return head + 0
        else:
            return head+x
return 0 instead of none. or you can do this trick.

0 commentaires