Se connecter
Se connecter

ou
Créer un compte

ou
Agrandir
Les Mains dans le Cambouis
Bidouille & Développement Informatique

Sujet Le pub des programmeurs

  • 1 925 réponses
  • 117 participants
  • 123 038 vues
  • 130 followers
Sujet de la discussion Le pub des programmeurs
Salut :coucou: y a des programeurs sur AF si oui vous bossez sous quoi ?
Afficher le sujet de la discussion
1711
Oui en Python, ctypes fait le job.
1712
Bon merki avec beauuuucoup de retard au fait pour les réponses! :-D

Juste pour savoir, il y en a qui touche un peu à QtQuick/QML?
1713
Pour initier le sujet et en partant de cette (excellente) vidéo sur Fibonacci :

Spoiler - Cliquer ici pour lire la suite


Citation de El :
:bravo:
J'aimerais bien trouver un truc aussi limpide pour expliquer la résolution des tours de Hanoi par algorithme récursif
172211.gif


Je propose :

def hanoi(n,dep,arr,piv):
  if n == 1:
    print "Déplacer un disque de "+dep+" vers "+arr
  else:
    hanoi(n-1,dep,piv,arr)
    hanoi(1,dep,arr,piv)
    hanoi(n-1,piv,arr,dep)


hanoi(3,'a','c','b')


Testable par simple copier-coller ici :
https://repl.it/languages/python

La dernière ligne appelle la fonction qui va résoudre le problème. Toutes les lignes avant sont la définition de la fonction.

Avec comme paramètres pour la fonction :
- nombre de disques à déplacer
- nom de la pile de départ
- nom de la pile d'arrivée
- nom de la pile servant de "pivot"

[ Dernière édition du message le 25/07/2018 à 21:55:50 ]

1714
Citation de srak :
Il n'y a pas une règle du genre: pas le droit de poser un disque plus grand sur un disque plus petit?


Tout à fait. Mais c’est pris en compte. On enlève les n-1 au-dessus de la pile, on déplace le plus grand, on remet la pile au-dessus. Donc ça marche.
On peut vérifier avec des petites valeurs de n !

Avec 4, ça fait précisément le gif du Migo (en moins joli) :

Spoiler - Cliquer ici pour lire la suite

[ Dernière édition du message le 25/07/2018 à 21:46:50 ]

1715
Et ça explique aussi l'équation donnée par 8oris :


Citation de 8oris :
Un classique :

U(n) (le nombre de mouvements) est égal à 2U(n−1)+1

[ Dernière édition du message le 25/07/2018 à 21:53:16 ]

1716
Citation :
def hanoi(n,dep,arr,piv):
  if n == 1:
    print "Déplacer un disque de "+dep+" vers "+arr
  else:
    hanoi(n-1,dep,piv,arr)
    hanoi(1,dep,arr,piv)
    hanoi(n-1,piv,arr,dep)


Une fonction récursive ? C'est pas interdit ca normalement ?
1717
Ah bah non ! Surtout dans un cas comme celui-là, ce serait dommage de se priver.

Par contre, il faut veiller à ne pas partir en boucle infinie. Et puis si on prévoit de l’appliquer sur de grandes valeurs, ce n’est pas le plus efficace (quand elle s’appelle plusieurs fois, comme ici : deux fois).
1718
Interdit par quoi ?

L'écueil des fonctions récursives c'est l'explosion de l'occupation mémoire : dans l'exemple donné il y aura U(n) appels de la fonction, avec à chaque fois une sauvegarde du contexte et un passage d'argument (et donc une nouvelle allocation) avant de tomber sur la condition d'arrêt puis de "fermer" les fonctions.

Un autre écueil possible est de dépasser les tailles max des types utilisé.
Par exemple pour le factoriel de n en C :

int factoriel (int n)
{
   if (n < 0) {
      exit (EXIT_FAILURE);
   }
   elseif ( n == 0) {
      return 1;
   }
   else {
      return n * factoriel (n - 1);
   }
}


On peut bien sûr choisir un long en argument de sortie, mais on ne fait que repousser le problème sans réellement mettre de garde fou.

Enfin... Là je noirci le tableau. Les fonctions récursives sont aussi très pratiques pour parcourir un arbre ou un graphe.
1719
Dans un système embarqué, la récursion c'est verboten !
Parce que ca consomme beaucoup de mémoire sur la pile, et tu ne sais pas combien à l'avance. Et si tu as des contraintes temps-réel, c'est plus dur de savoir précisément combien de temps ça prend.

Quant au type 'long', attention : sa taille dépend des systèmes, et sur la plupart des bécanes il fait la même taille qu'un 'int'.
Pour être sûr d'avoir un mot 64 bits, il faut utiliser 'long long'.
Ou mieux encore, utiliser stdint.h

[ Dernière édition du message le 26/07/2018 à 08:56:14 ]

1720
Citation de Jimbass :
Dans un système embarqué, la récursion c'est verboten !

Oui mais là on est loin des programmes pour débutants ! (« Système embarqué » = avion, satellite...)


Et il y a justement une interview dans le Monde du créateur de Python. Qui pense d’ailleurs prendre sa retraite prochainement pour son activité de pilotage des évolutions du langage :
https://abonnes.lemonde.fr/pixels/article/2018/07/25/je-n-imaginais-pas-que-python-connaitrait-un-tel-succes_5335917_4408996.html