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

Free Pascal Discussion :

Quick sort : erreur de segmentation [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Quick sort : erreur de segmentation
    Bonjour,

    Nous voyons en cours actuellement la récursivité, je me suis donc essayé à l'implémenter en Pascal avec FreePascal. J'ai tenté d'implémenter le tri rapide ou QuickSort mais je trouvais toujours à l'execution ce code-ci : erreur de segmentation.
    Après plusieurs recherches, je ne voyais pas où mon algorithme buggait, j'ai donc tenté d'implémenter une fonction plus simple utilisant la récursivité comme la fonction factorielle. Voici mon code :
    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
    program factrecursif;
     
    function fact(x:Integer):Integer;
    begin
    if (x=1) and (x=0) then
    fact:=1
    else
    fact:=x*fact(x-1)    
    end;
     
    var x:Integer;
    begin
    writeln('combien?');
    readln(x);
    writeln(fact(x))
    end.
    Et à l'éxecution, même problème... erreur de segmentation. Je me demande alors si mon code a un problème ? Si cela vient de Linux ? du compilateur FreePascal ? Bref... Pourquoi je n'arrive pas à exécuter mon programme récursif ?

    En vous remerciant par avant et de m'avoir lu.

    Cordialement,

    Jerem'

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Bonjour.

    Dans ton code il y a 1 erreur pour que la récursivité marche, il faut que le "result" soit égal à fact(x-1). Comme, les routines sont en fait des piles, il faut que le dernier de la routine soit rempli pour que le premier appel de la routine renvoie une valeur.
    Par exemple ici, ce qu'on vérifie si ta routine est bien faite il faut se poser la question suivante: Combien vaut la factorielle de 5?
    En regardant ta fonction, il est évident que ça vaut 5x4!
    et ainsi de suite jusqu'à fact(1-1) ou dans ce cas, fact=1.
    J'espère avoir été clair.

    Sinon, mon code pour ce programme est le 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
    program factrecursif;
     
    function fact(x:integer):integer;
    begin
    	if (x=0) then
    		fact:=1
    	else
    		result:=x*fact(x-1) 
    end;
     
    var x:integer;
    begin
    writeln('combien?');
    readln(x);
    writeln(fact(x))
    end.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur algo quick sort ?
    Par guigouz dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 24/04/2008, 01h03
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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