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

Turbo Pascal Discussion :

Pile d'exécution pour la fonction factorielle récursive


Sujet :

Turbo Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Points : 18
    Points
    18
    Par défaut Pile d'exécution pour la fonction factorielle récursive
    Bonjour,
    svp, je veux savoir le remplissage pas à pas de la pile lors de l'exécution de la fonction récursive de calcul du factoriel(n), pour par exemple n = 4
    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Pour savoir ça, tu prends un papier et un crayon et tu traces "à la main".

  3. #3
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    C'est ça ce que je veux savoir! l'execution à la main : qu'est-ce qu'on range dans la pile? donnez moi un exemple svp!
    merci

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pfff

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function Fact(N: LongInt): LongInt;
    begin
      if N <= 1 then
        result := 1
      else
        result := N * Fact(N-1);
    end;
    en assembleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Fact(10);
    0040B170 mov eax,$0000000a // 10
    0040B175 call Fact 
     
     
    function Fact(N: LongInt): LongInt;
    begin
      $0040AD64 push ebx
      $0040AD65 mov ebx,eax
     
      if N <= 1 then
        $0040AD67 cmp ebx,$01 
        $0040AD6A jnle $0040ad73
     
        result := 1
        $0040AD6C mov eax,$00000001 
        $0040AD71 pop ebx
        $0040AD72 ret 
     
      else
        result := N * Fact(N-1);
        $0040AD73 mov eax,ebx 
        $0040AD75 dec eax
        $0040AD76 call Fact
        $0040AD7B imul ebx
     
    end;
    $0040AD7D pop ebx
    $0040AD7E ret




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function Fact(N: LongInt): extended;
    begin
      if N <= 1 then
        result := 1
      else
        result := N * Fact(N-1);
    end;
    qui génére l'assembleur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Fact(10);
      $0040B1B8 mov eax,$0000000a
      $0040B1BD call Fact
      $0040B1C2 fstp st(0)
     
     
    functon Fact(N: LongInt): extended;
    begin
    $0040AD64 push ebx
    $0040AD65 add esp,-$10
    $0040AD68 mov ebx,eax
     
      if N <= 1 then
      $0040AD6A cmp ebx,$01 
      $0040AD6D jnle $0040ad85
     
        result := 1
        $0040AD6F xor eax,eax
        $0040AD71 mov [esp],eax
        $0040AD74 mov [esp+$04],$80000000
        $0040AD7C mov word ptr [esp+$08],$3fff
        $0040AD83 jmp $0040ad9b
     
      else
        result := N * Fact(N-1);
        $0040AD85 mov eax,ebx
        $0040AD87 dec eax
        $0040AD88 call Fact
        $0040AD8D mov [esp+$0c],ebx
        $0040AD91 fild dword ptr [esp+$0c]
        $0040AD95 fmulp st(1)
        $0040AD97 fstp tbyte ptr [esp]
        $0040AD9A wait 
    end;
    $0040AD9B fld tbyte ptr [esp]
    $0040AD9E add esp,$10
    $0040ADA1 pop ebx
    $0040ADA2 ret

    bonne analyse.

  5. #5
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    merci pour votre aide mais je comprend pas en assembleur, si vous pouvez m'expliquer autrement par exemple dessinez moi la pile d'execution de cet exemple à savoir que je veux une solution simple, clair et facile à comprendre comportant le minimum nécessaire pour comprendre comment s'execute un module récursif.
    merci pour votre aide

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 963
    Points : 59 646
    Points
    59 646
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Lors de l'appel d'une telle fonction, toute simple, le paramètre N est tout d'abord déposé sur la pile, puis l'adresse de retour (pour pouvoir poursuivre l'exécution du programme lorsque la fonction s'achève). La récursion entraîne peu de consommation de pile.

    Mais si une fonction reçoit des paramètres de type complexe par valeur, une copie temporaire en est faite sur la pile. S'il y a des variables locales, elles sont toutes réservées dans la pile. Une utilisation récursive d'une telle fonction peut vite faire exploser la pile.

    Poste-nous le code exact de ta fonction et nous t'aiderons à dresser un plan de la pile lors de son exécution.

  7. #7
    Membre à l'essai
    Profil pro
    Enseignant
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    bonsoir,
    voilà mon exemple :
    Soit la procédure suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure tester (n:integer);
    begin
     if n>0   then
      		 begin
       			 tester (n div 2);
       			 write(n mod 2);
       		end;
    end;
    Qu’affiche cette procédure dans chacun des cas suivants: N=13, N= -5, N=0 et N = 19. expliquez le déroulement de l’exécution de la procédure.

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 665
    Points
    5 665
    Par défaut
    Goe,
    Citation Envoyé par HASALGO Voir le message
    Qu’affiche cette procédure dans chacun des cas suivants: N=13, N= -5, N=0 et N = 19. expliquez le déroulement de l’exécution de la procédure.
    En clair, c'est un exercice scolaire.

    Exécute ton programme, regarde l'affichage, et éventuellement note-le.

    PUIS, papier + crayon, et tu exécutes manuellement ligne par ligne, en notant bien toutes les valeurs des variables, etc.
    Ça devrait te faire comprendre.

Discussions similaires

  1. Aide pour une fonction récursive.
    Par fred61 dans le forum Débuter
    Réponses: 13
    Dernier message: 21/01/2015, 08h39
  2. [AC-2007] Problème d'exécution entre requète et module pour une fonction quartile
    Par Fcnaatao dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 28/02/2012, 09h50
  3. Réponses: 27
    Dernier message: 23/03/2008, 23h39
  4. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58
  5. autre probleme pour deriver fonction
    Par voyageur dans le forum Mathématiques
    Réponses: 15
    Dernier message: 28/07/2003, 14h37

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