[BASH] Factorielle - Script incorrect ?

Factorielle - Script incorrect ? [BASH] - Shell/Batch - Programmation

Marsh Posté le 25-10-2003 à 11:37:25    

Bonjour à tous,
 
J'ai créé un script bash récursif pour calculer la factorielle d'un nombre donné en argument ($1).  
Mais j'ai un problème avec ce script. A partir de $1 a 7, il affiche un peu tout et n'importe quoi (factorielle de 7 de 176 au lieu de 5040).
J'ai lu que le bash ne supportait que les calculs de valeurs comprises entre  - 2 000 000 (environ) et 256. Mais malgré cette indication je n'arrive pas à coder le script (j'ai pensé à utiliser des valeurs * -1 pour éviter la limitation mais je bloque).  
 
Merci de votre précieuse aide.
 
Le script :
 
#!/bin/sh
 
# Fonction de factorielle
fact ()
{
  if test $1 -eq 0
    then return 1
  else
    # On Cherche à calculer n*fact(n-1)
    # n étant la valeur de l'argument de la fonction fact
    #
    # Ne pas oublier l'expression du type $(( ... )) pour calculer une expression mathématique
    fact $(( $1-1 ))
    return $(( $1 * $? ))
  fi
}
 
# Message d'erreur et sortie du programme si <> d'1 argument
if test $# -ne 1
then
   echo "Vous devez saisir UN argument !"
else
   # Vérifie que l'argument $1 est positif
   if test $1 -lt 0
   then
      echo "L'argument doit etre POSITIF !"
   else
      # Dans le cas ou la personne a bien saisie UN SEUL ARGUMENT
      # On appelle la fonction avec l'argument entré
      fact $1
      echo "La factorielle de $1 est $?"
   fi
fi

Reply

Marsh Posté le 25-10-2003 à 11:37:25   

Reply

Marsh Posté le 25-10-2003 à 20:34:12    

Tu ne peux pas utiliser « return » pour retourner la valeur de ta fonction recursive. « return » ne peut retourner que des valeurs comprises entre 0 et 255. C'est fait pour retourner un return code (success ou echec), pas une valeur destinee a etre traitee.
 
Si tu veux absolument faire une fonction recursive, « echo » la valeur calculee par ta fonction. Tu peux faire un truc du genre :

#!/bin/sh
 
fact() {
        n=$1
        if [ $n -eq 0 ]
        then
                echo 1
        else
                echo $(( n * `fact $(( n - 1 ))` ))
        fi
}
 
echo `fact $1`


 
Ah et puis un autre truc : la syntaxe « $(( $var - 1 )) » que tu utilise n'est pas bonne. La bonne syntaxe est « $(( var - 1 )) ». La difference est subtile : dans le prenier cas $var est interpolle avant d'evaluer l'expression. Dans le deuxieme cas var est interpolle quand l'expression est evaluee. Dans le premier cas tu auras une erreur de syntaxe si var est vide (car bash essaira de calculer « $(( - 1 )) », ce qui ne veut rien dire). En particulier si tu utilises la premiere forme (pas bonne), tu auras systematiquement une erreur si tu execute ton script en mode « validation » (ou bash verifie la syntaxe du script sans l'executer).


Message édité par matafan le 25-10-2003 à 20:37:05
Reply

Marsh Posté le 26-10-2003 à 11:58:30    

Je te remercie pour tes précieux conseils :-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed