Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1514 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [BASH] Factorielle - Script incorrect ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[BASH] Factorielle - Script incorrect ?

n°550223
aptget
Posté le 25-10-2003 à 11:37:25  profilanswer
 

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

mood
Publicité
Posté le 25-10-2003 à 11:37:25  profilanswer
 

n°550470
matafan
Posté le 25-10-2003 à 20:34:12  profilanswer
 

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
n°550693
aptget
Posté le 26-10-2003 à 11:58:30  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [BASH] Factorielle - Script incorrect ?

 

Sujets relatifs
Moteur de recherche interne script ???Bug dans le lancement d'un script a heure reguliere
Script shell Linux > petit prob avev exprDebug d'un script de gestion d'erreur
forcer execution script PHP ou empecher fermeture fenetre?[PHP] un script pour récupérer des infos sur Allocine ?
[PHP] Les sessions avec cookies - (script de PHPScript)[PHP] Cookies -> identification utilisateurs (exemple de script)
Script d'Upload pour Lycos - Multimania[CGI/HTML] Faire une calculette avec un script
Plus de sujets relatifs à : [BASH] Factorielle - Script incorrect ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR