IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

[Récursivité] Existe-t-il des cas où elle est inévitable ?


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut [Récursivité] Existe-t-il des cas où elle est inévitable ?
    Bonjour à toutes et à tous.
    J'ai entendu des dizaines de fois des phrases comme "Ça me gêne d'utiliser une fonction récursive, mais j'ai pas le choix" ... Mais je pense, sans pouvoir le démontrer, qu'il est toujours possible de l'éviter.
    Quelqu'un pourrait-il, si cela existe, me trouver un cas où il n'est à priori pas possible de l'éviter ?

    Merci.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Toute fonction récursive peut-être transformée en fonction non-récursive, par exemple en utilisant une pile.

    D'ailleurs la machine de Turing n'est pas récursive, elle permet pourtant de calculer tout ce qui est calculable.

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    J'ai entendu des dizaines de fois des phrases comme "Ça me gêne d'utiliser une fonction récursive, mais j'ai pas le choix" ... Mais je pense, sans pouvoir le démontrer, qu'il est toujours possible de l'éviter.
    La récursivité est un style de programmation, ce n'est pas une solution "obligatoire" à un problème.

    C'est vrai qu'il est plus simple d'employer le style récursif lorsque l'algorithme utilise une méthode inductive (= un raisonnement par récurrence). Mais on peut très bien employer un autre style comme l'itératif ou le fonctionnel.

    De toutes façons, dans les langages impératifs, les appels récursifs sont transformés en appels séquentiels (call & return) avec une pile de mémoire pour sauvegarder/restaurer le contexte local entre chaque appel.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    De toutes façons, dans les langages impératifs, les appels récursifs sont transformés en appels séquentiels (call & return) avec une pile de mémoire pour sauvegarder/restaurer le contexte local entre chaque appel.
    Exact ... cela constitue en quelque sort une preuve

    PS : j'aime beaucoup l'incrustation de ton père noël

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Il faut tout de même voir que même si toute fonction récursive peut-être transformé en itération, ce n'est pas toujours pertinent de le faire, certaines solutions sont naturellement récursive et leur équivalent itératif demande de simuler la récursion par une structure de donnée type pile... L'intérêt est alors limité.
    Evidemment ça dépend aussi du langage, par exemple les langages qui optimisent la récursivité terminale n'ont pas besoin de boucles, par contraste, certains langages supportent très mal le style récursif parce que leur pile est trop petite ou les appels de fonctions trop couteux. C'est le cas par exemple du C et d'autres langages impératifs historiques, qui ont malheureusement forgé cette mauvaise réputation de la récursivité dans toute une génération de programmeurs.

    --
    Jedaï

  6. #6
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Simple curiosité:
    L'algorithme de Strassen peut-il être programmé sans récursivité ?
    Jean-Marc Blanc

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Simple curiosité:
    L'algorithme de Strassen peut-il être programmé sans récursivité ?
    Jean-Marc Blanc
    Ben oui, comme tout le reste: il suffit d'implémenter la récursivité sans récursivité!

    Mais ça risque d'être coûteux!

    )jack(

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour.
    Ça me gêne d'utiliser une fonction récursive
    On évite d'utiliser la récursivité quand :
    - l'horizon est trops grand (nombre d'itérations qui nécessite des sauvegarde de mémoires et de registres)
    - en programmation temps-réel qui privilégie les interruptions.
    Mais on l'utilise quand on veut faire un "beau programme" (la programmation est aussi de l'art).
    La récursivité permet la meilleure concision (logiciel le plus court)
    exemple en Caml de la factorielle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let rec fac=fun 0 ->1 |n ->n*fac(n-1);;
    Que c'est beau!

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Il faut tout de même voir que même si toute fonction récursive peut-être transformé en itération, ce n'est pas toujours pertinent de le faire, certaines solutions sont naturellement récursive et leur équivalent itératif demande de simuler la récursion par une structure de donnée type pile... L'intérêt est alors limité.
    Nous sommes d'accord jusqu'ici.

    Evidemment ça dépend aussi du langage, par exemple les langages qui optimisent la récursivité terminale n'ont pas besoin de boucles, par contraste, certains langages supportent très mal le style récursif parce que leur pile est trop petite ou les appels de fonctions trop couteux. C'est le cas par exemple du C et d'autres langages impératifs historiques, qui ont malheureusement forgé cette mauvaise réputation de la récursivité dans toute une génération de programmeurs.
    Il y a déjà assez de bonnes raisons pour critiquer le C que pour ne pas en inventer des fausses. Le C n'a pas de limitations intrinsèque sur la profondeur de pile -- elles sont le fait de l'OS -- et ses conventions d'appels de fonctions sont parmi les moins coûteuses qui soient, et historiquement c'est un des premiers langages avec les Lisp à permettre les appels récursifs sans marquage particulier. Il faut remonter à bien plus loin pour comprendre d'où vient la réputation de lenteur des appels de fonctions, et en particulier des appels de fonctions récursifs. Et ce n'est pas dû aux langages, mais aux architectures.

    Il a fallu du temps pour établir les conventions actuelles à base de pile. Une technique courante d'appel de fonction était de placer les paramètres à un endroit fixe en mémoire. L'adresse de retour était soit un des paramètres placés aux même endroit, soit carrément patchée dans l'instruction de saut terminant la routine. Naturellement, avec un tel mécanisme de base, les fonctions récursives étaient difficiles à supporter.

  10. #10
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Désolé, ma formulation n'était pas très claire, je ne voulais pas dire que les appels de fonctions en C étaient couteux, c'était juste l'un des exemples de problèmes potentiel pour la récursivité dans un langage. Je disais simplement que C n'était pas adapté à la récursivité, d'une part parce que la pile est souvent trop petite (même si je suis d'accord que ce n'est pas spécifié dans le standard), d'autre part parce qu'il est très difficile d'écrire des closures ou même de simple fonctions imbriquées (ce n'est pas supporté par le langage), ce qui réduit l'intérêt de la récursivité pour le programmeur.

    --
    Jedaï

Discussions similaires

  1. Réponses: 17
    Dernier message: 10/07/2015, 16h58
  2. [WD-2010] TextBox affichant des indications quand elle est vide
    Par Tho69 dans le forum Word
    Réponses: 0
    Dernier message: 29/08/2013, 10h09
  3. ajouter des lignes qd elles n'existent pas
    Par freestyler dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 30/01/2008, 15h28
  4. existe t 'il des programme pour transformer les bases
    Par creazone dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/10/2004, 14h11
  5. Existe-t-il des Dé-compilateurs sur Terre?
    Par Julien_riquelme dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 15/12/2003, 01h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo