Factorielle - Script incorrect ? [BASH] - Shell/Batch - Programmation
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 |
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).
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