Chaque semaine, Mohammad S. Anwar envoie The Weekly Challenge, une chance pour nous tous de trouver des solutions à deux tâches hebdomadaires. Mes solutions sont d'abord écrites en Python, puis converties en Perl. C'est une excellente façon pour nous tous de pratiquer le codage.
Défi, Mes solutions
Vous recevez une liste d'itinéraires, @routes.
Écrivez un script pour trouver la destination sans autre connexion sortante.
C'est assez simple et ne nécessite donc pas trop d'explications. Je calcule deux listes, les origines ont les premières valeurs de la liste des itinéraires tandis que les destinations ont la deuxième valeur.
J'utilise ensuite la compréhension de liste pour trouver des destinations qui ne figurent pas dans la liste des origines, et je les stocke comme impasses. Je génère une erreur s'il n'y a pas exactement un élément dans cette liste.
def no_connection(routes: list) -> str: origins = [v[0] for v in routes] destinations = [v[1] for v in routes] dead_ends = [d for d in destinations if d not in origins] if len(dead_ends) > 1: raise ValueError( 'There are multiple routes with no outgoing connection') if len(dead_ends) == 0: raise ValueError('All routes have an outgoing connection') return dead_ends[0]
$ ./ch-1.py B C C D D A A $ ./ch-1.py A Z Z
Calculez le nombre de façons de rendre la monnaie pour un montant donné en centimes. En utilisant les pièces, par ex. Penny, Nickel, Dime, Quarter et Half-dollar, de combien de manières distinctes la valeur totale peut-elle être égale au montant donné ? L'ordre de sélection des pièces n'a pas d'importance.
En raison d'un bug (maintenant corrigé) dans mon code, cela a pris un peu plus de temps que je ne l'avais espéré. Je sais que Python et Perl ont un débogueur, mais parfois, vous ne pouvez pas battre les instructions print :)
Cela fait un moment que nous n'avons pas de tâche qui fait appel à l'utilisation d'une fonction récursive. Pour cette tâche, j'ai une fonction récursive appelée making_change qui prend la monnaie restante et la dernière pièce utilisée. Le premier appel définit la valeur left_change sur l'entrée et la valeur last_coin sur None (undef en Perl).
Chaque appel parcourt les pièces possibles et fait l'une des trois choses suivantes :
La valeur des combinaisons est transmise en amont afin que le retour final ait le nombre correct de combinaisons.
def making_change(remaining: int, last_coin: int | None = None) -> int: combinations = 0 for coin in [1, 5, 10, 25, 50]: if last_coin and last_coin < coin: continue if coin == remaining: combinations += 1 if coin < remaining: combinations += making_change(remaining-coin, coin) return combinations
Il y a des limites à la récursivité. Perl avertira lorsqu'une récursion est (100 de profondeur)[https://perldoc.perl.org/perldiag#Deep-recursion-on-subroutine-%22%25s%22]. Cette valeur ne peut être modifiée qu'en recompilant Perl. Par défaut, Python générera une (ResursionError)[https://docs.python.org/3/library/exceptions.html#RecursionError] après 995 récursions, bien que cette valeur puisse être modifiée au moment de l'exécution.
$ ./ch-2.py 9 2 $ ./ch-2.py 15 6 $ ./ch-2.py 100 292
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!