Forum Programmation.shell Suite fibonnaci

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
8
oct.
2015

Bonsoir tout le monde ,
J'ai le script suivant que j'ai nommé fibon.sh

#!/bin/sh
if [$1 -eq 0] || [$1 -eq 1 ];
then
    echo 1
else 
   n=$1
   fib1='bash ./fibo.sh $(($n-1))'
   fib2='bash ./fibo.sh $(($n-2))'
   echo  $(($fib1 + $fib2))
fi

ensuite je suis allé sur shell , j'ai ajouté fibon.sh aux bins ( pour qu'il puisse etre reconnu et exécuté) et quand je tape ensuite sur le terminal par exemple fibon.sh 4 voici ce que j'obtiens :

/home/F/Bureau/fibo/fibon.sh: 2: /home/mn/Bureau/fibo/fibon.sh: [4: not found
/home/F/Bureau/fibo/fibon.sh: 2: /home/mn/Bureau/fibo/fibon.sh: [4: not found
/home/F/Bureau/fibo/fibon.sh: 9: /home/mn/Bureau/fibo/fibon.sh: arithmetic expression: expecting EOF: "bash ./fibo.sh $(($n-1)) + bash ./fibo.sh $(($n-2))"

SVP aidez moi :/ :/ :/

  • # Bashism

    Posté par  . Évalué à 4.

    Déjà les espaces après les [ sont importants en shell, sinon il va chercher à exécuter le programme [4 et évaluer le résultat avec le if.

    Donc : if [ $1 -eq 0 ] || [ $1 -eq 1 ]

    Ensuite pour exécuter un sous-shell c’est pas 'commande' qu'il faut utiliser , mais `commande` ou $(commande)

    • [^] # Re: Bashism

      Posté par  (site web personnel) . Évalué à 6.

      Shellcheck, en ligne ou localement, peut aider pour détecter ce genre de soucis.

      • [^] # Re: Bashism

        Posté par  . Évalué à 2.

        bash -n peut aider pour la syntaxe et ./lenomduscript rends dépendant son exécution à où il se trouve sur le filesystem.

  • # simplifions tout ca

    Posté par  . Évalué à 4. Dernière modification le 08 octobre 2015 à 13:42.

    #!/bin/sh
    if [ $1 -eq 0 ] || [ $1 -eq 1 ];
    then
        echo 1
    else 
       n=$1
       fib1=`$0 $(($n-1))`
       fib2=`$0 $(($n-2))`
       echo  $(($fib1 + $fib2))
    fi

    $0 rappelle la commande que tu viens de lancer donc fibo.sh

  • # Efficacité

    Posté par  (site web personnel) . Évalué à 3.

    Au passage, ton programme, là, c'est l'exemple typique d'implémentation hautement inefficace de la suite de Fibonacci : chaque appel du programme déclenche deux autres appels, ce qui fait qu'il a, en temps de calcul comme en consommation mémoire, un coût qui varie en fonction exponentielle du numéro du terme que tu veux calculer.

    La bonne façon de faire consiste à trouver un moyen de mémoriser les termes déjà calculés, de façon à éviter de les recalculer ; on peut ainsi arriver à écrire un programme dont le coût est proportionnel au numéro du terme à calculer. Mais je doute que ce soit possible par appels successifs d'un programme.

    • [^] # Re: Efficacité

      Posté par  . Évalué à 1. Dernière modification le 09 octobre 2015 à 14:49.

      Le temps de calcul est exponentiel mais la conso mémoire est quand même linéaire avec l'algo récursif (la taille max de la pile d'appel pendant le calcul de fib(n) est n)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.