1
votes

y a-t-il une meilleure façon d'écrire ces fonctions?

[! [entrez la description de l'image ici] [1]] [1]

La première fonction renvoie la somme des chiffres récursifs de ce nombre. La deuxième fonction renvoie le dictionnaire où la clé est reg_dig_sum et la valeur est le décompte de ce nombre. quand je l'ai testé, il a échoué en me donnant ceci

elf.assertEqual (sum_dict [0], 1) AssertionError: 0! = 1

Comment puis-je résoudre ce problème?

def reg_dig_sum(n):
    x = sum(int(digit) for digit in str(n))
    if x < 10:
        return x
    else:
        return reg_dig_sum(x)

def distr_of_rec_digit_sums(low=0, high=1500):
    distr = {}
    for x in range(low, high):
        if reg_dig_sum(x) not in distr:
            distr[reg_dig_sum(x)] = 0
        else:
            distr[reg_dig_sum(x)] += 1 
    return distr


3 commentaires

D'après ce que j'ai compris, cette ligne distr [reg_dig_sum (x)] = 0 devrait être distr [reg_dig_sum (x)] = 1 .


Merci j'ai accepté!


@KateKiatsiri, vos questions trouveront une réponse plus facile si vous les formatez correctement, comme Chris l'a indiqué ci-dessus. Cela aide vraiment; il peut être difficile pour les nouveaux arrivants dans la communauté de s'implanter.


3 Réponses :


2
votes
  • Le problème que je peux penser est que votre décompte pour chaque reg_dig_sum sera un de moins que ce qu'il devrait être. C'est la raison pour laquelle la condition d'assertion échoue.
  • Vous pouvez corriger cette erreur logique en initialisant distr sur 1 ou en supprimant la condition else .
  • Je suggère également d'utiliser d'autres alternatives comme defaultdict pour prendre en charge l'initialisation pour vous.
  • from collections import defaultdict
    def distr_of_rec_digit_sums(low=0, high=1500):
        distr = defaultdict(int)
        for x in range(low, high):
            distr[reg_dig_sum(x)] += 1 
        return distr
    
    • Utilisation de defaultdict
    def distr_of_rec_digit_sums(low=0, high=1500):
        distr = {}
        for x in range(low, high):
            if reg_dig_sum(x) not in distr:
                distr[reg_dig_sum(x)] = 1 # this should be initialized to 1 for first occurance.
            else:
                distr[reg_dig_sum(x)] += 1 
        return distr
    

5 commentaires

@Chris Question est déjà incomplète.J'ai fourni une description en une ligne, mais sans plus de précision de OP, c'est difficile à expliquer.


Je suis d'accord: la question n'est pas claire. Il est donc très difficile d’apporter une réponse utile. Et cela ne change rien au fait que le code doit être accompagné d'une explication.


@Chris a mis à jour et expliqué ma solution actuelle


@Poojan Merci de votre aide. Ma question est que je ne sais pas ce qui ne va pas avec mes codes. Il échoue aux tests. J'ai donc changé mon code comme vous le suggérez mais il a toujours échoué. Désespéré ici


ok les gars j'ai manqué de lire que le haut est inclusif: (donc je viens de changer pour x dans la gamme (bas, haut + 1) et ça marche très bien! Merci à tous !!!!



1
votes

Voir les commentaires et réponses précédents concernant le changement de 0 en 1

Essayez également d'utiliser un code beaucoup plus simple pour reg_dig_sum avec le même résultat:

def reg_dig_sum(n):
    return (n - 1) % 9 + 1


2 commentaires

oui mais alors je ne peux pas utiliser la fonction reg_dig_sum () dans une autre fonction pour être une clé de dictionnaire ..


Je ne suis pas sûr de bien comprendre votre question, mais je ne vois aucune différence pour l'utilisation de reg_dig_sum () à partir d'autres fonctions ou de la portée globale - entre votre code et mon code. Mais ma version est beaucoup plus rapide et le résultat est le même. La seule différence si vous utilisez zéro comme argument - alors vous devez spécifier le résultat explicitement



0
votes

J'ai utilisé une fonction simple pour faire cela pendant longtemps:

def sum_digits(num):
    if num <= 9:
        return num
    num = int(num / 10) + num - int(num / 10) * 10
    ''' takes the last digit of num off, and adds it to num. '''
    return sum_digits(num)

Il y a beaucoup de choses que vous pouvez trouver avec cette fonction. Essayez ceci sur la série Power, et vous verrez ce que je veux dire. En fait, toute fonction mathématique que vous pourriez utiliser sur une droite numérique renverra des motifs intéressants; cette fonction vous aide à en voir une partie.


0 commentaires