Bonjour.
Quelqu'un peut il m'aider a ecrire un script qui calcule la factoriel d'un nombre entre en parametre?
Merci d'avance.
Cordialement.
Version imprimable
Bonjour.
Quelqu'un peut il m'aider a ecrire un script qui calcule la factoriel d'un nombre entre en parametre?
Merci d'avance.
Cordialement.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #!/bin/sh fact() { n=$1 if [ $n -eq 0 ] then echo 1 else echo $(( n * `fact $(( n - 1 ))` )) fi } echo `fact $1`
Super de mettre de la récursivité là où on peut s'en passer. Par ailleurs, c'est dommage de ne pas protéger les variables d'une fonction (que se passe-t-il si j'écris avant l'appel de la fonction "n=12" puis que je désire récupérer "n" après ???)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #!/bin/sh fact() { # Je protège toutes mes variables grace à la création d'un sous-shell ( res=1 val=$1 while test $val -gt 1 do res=`expr $res \* $val` val=`expr $val - 1` done echo $res ) } echo `fact $1`
là il est détruit mais il suffit de le stocker s il souhaite resortir son paramètre.
la récursivité c est souvent plus simple mais c est vrai que ta solution n était pas si dure que ça :D
Merci a tous pour votre promptitude.
Cordialement.
Exact. Si tu mets "n=12" avant l'appel, ça signifie que tu veux le garder. Mais comme les fonctions en shell ne créent pas d'environnement à part, le "n" de la fonction correspond au "n" du code principal et il y a écrasement. Pour pallier cet inconvénient, 2 solutions
1) mettre des parenthèses dans le corps de la fonction comme j'ai écrit
2) déclarer "n" (ou toute autre variable) comme "local" en écrivant "local n" au début du code
et plus lourde pour le processeur.
[edit]D'ailleurs je me suis amusé, pour le fun, à réécrire un code de factorielle absolument sans boucle
Aucun while, aucun until, aucun for et pourtant ça marche => lancer le script et mettre le nombre en argumentCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 #!/bin/sh nb=${nb:-$1} res=${res:-1} if test $nb -gt 1 then res=`expr $res \* $nb` nb=`expr $nb - 1` source $0 else echo $res fi