2 votes

Comment puis-je compléter mon code Python pour le "persistence bugger" ?

Je ne sais pas comment compléter mon code pour le problème de "persistence bugger". Le but est de créer une fonction appelée "persistance" qui renvoie le nombre d'itérations jusqu'à ce que les chiffres d'un nombre multipliés ensemble soient égaux à un nombre à un chiffre.

Par exemple : persistance(39) = 3, car 3*9 = 27, 2*7 = 14, et 1*4 = 4 ; donc, trois itérations.

Voici mon code jusqu'à présent, et je ne suis pas sûr de savoir où aller à partir de maintenant ou si ce que j'ai est correct. Toute aide serait appréciée.

def persistence(num):
  num_str = str(num)
  total = 1
  for i in num_str:
    total = total * int(i)
  while len(str(total)) <> 1:
    total = total * total(i)
    #not sure what to do from here...

2voto

Haidro Points 24336

Vous remarquerez que si vous voulez faire ce que vous avez fait pour 39 a 27 vous répéterez le code. C'est un cas où la récursivité peut être utile (appeler la fonction en elle-même) :

def persistence(num):
    if num < 10:
        return 0 # Only one digit. Can't iterate over it
    num_str = str(num)
    total = 1
    for i in num_str:
        total = total * int(i)
    return 1 + persistence(total) # We do 1 + because we just did an iteration

Imaginons que l'entrée soit 39 :

  1. 39 n'est pas inférieur à 10, nous passons donc à l'étape suivante.
  2. Nous faisons le même code que celui que vous avez fourni pour obtenir le total en multipliant les chiffres.
  3. Nous avons maintenant un nouveau numéro (27) attribué à total . Nous répétons le code ci-dessus en appelant à nouveau la fonction, mais au lieu de passer 39, nous passons 27.
  4. 27 n'est pas inférieur à 10, nous passons donc à l'étape suivante
  5. Nous obtenons la multiplication des chiffres
  6. Nous répétons l'opération jusqu'à ce que nous obtenions un total de 4 (1*4).
  7. Nous appelons persistance(4), mais il renvoie 0 parce que 4 < 10. Aucune itération n'a été effectuée pour le nombre 4 (c'est pourquoi nous renvoyons 0 )
  8. À ce stade, la récursivité s'est arrêtée. Python revient maintenant sur tous les appels précédents. Il ajoute 0 + 1 + 1 + 1 pour obtenir 3.

La récursivité est un peu difficile à comprendre au début, mais il s'agit essentiellement d'une fonction qui s'appelle elle-même, mais qui a des "cas de base" pour empêcher la fonction de s'exécuter indéfiniment. Dans ce cas, notre cas de base est si le nombre est inférieur à 10 (il a un chiffre). Aucune itération n'a lieu sur ce nombre.

0voto

Tim Points 591

La réponse de TerryA est très bonne, et lorsque vous voulez continuer à appliquer le résultat d'une fonction à la même fonction (comme dans cet exemple), la récursivité est normalement une très bonne idée. Par souci d'exhaustivité, la solution peut être mise en œuvre avec une simple boucle while, qui n'est pas très différente de ce que vous avez essayé de faire :

def persistance(num):
    counter=0
    while num>9:
        counter+=1
        num_str=str(num)
        total=1
        for i in num_str:
            total=total* int(i)
        num=total
    print (counter)

Le compteur comptabilise le nombre d'exécutions de la boucle, ce qui vous donne la réponse finale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X