1
votes

Calculateur de séquence de Fibonacci

J'ai un problème avec certains devoirs, donc fondamentalement, on nous a demandé de créer un script bash qui prend une variable supérieure à 2 et renvoie le même nombre de numéros de séquence de Fibonacci, i.o. si je devais en donner 5, il imprimerait: 0 1 1 2 3 J'ai fait des recherches et j'ai trouvé une idée unique que je n'ai vraiment vue nulle part en ligne, (gardez à l'esprit que j'ai une certaine expérience en python) mais j'ai rencontré un problème, donc en gros, j'utilise une expression for dans bash et 2 variables pour calculer la séquence, je commence par les définir manuellement à 0 et 1 (les premier et deuxième nombres de la séquence), puis je les additionne en changeant leurs valeurs,

Voici donc le code:

#!/bin/bash
a=0
b=1
for i in $(seq 1 $1);
do
  if ["$a" -gt "$b"]
  then 
    b=($a +$b)
    echo "$b"
  else
    a=($a +$b)
    echo $a
  fi
done

J'ai de nombreux problèmes et je m'attends à être complètement hors de contexte, mais j'espère que vous aurez une idée générale et que vous pourrez m'aider à résoudre le problème: / Il semble que je veuille que quelque chose soit traité comme un nombre mais il est traité comme du texte ... Je ne sais pas cependant, toute aide est très appréciée


2 commentaires

Shellcheck produit 3 résultats majeurs pour votre code. Vous devez les corriger avant de continuer. Voir également Fibonacci récursif dans le script Bash et ses amis.


vous avez des réponses valables, pourquoi ne pas prendre le temps de les remercier en les acceptant et / ou en les votant?


5 Réponses :


0
votes

Vous étiez très proche, quelques petits changements syntaxiques et de nouvelles valeurs initiales le font fonctionner.

Notes:

    Les espaces
  • sont importants dans bash, en particulier avec les caractères spéciaux [];
  • aussi, le calcul avec un nombre entier peut être forcé en utilisant let

Bonne idée d'utiliser une comparaison pour faire le calcul avec seulement deux variables :)

#!/bin/bash - 
a=1
b=0
echo $a
for i in $(seq 1 $1);
do
    if [ $a -gt $b ] ; then
        let b=($a +$b)
        echo $b
    else
        let a=($a +$b)
        echo $a
    fi
done


0 commentaires

0
votes

il y a un contexte arithmétique dans bash.

une légère réécriture peut être

$ a=0; b=1; 
  for i in {1..9}; 
  do c=$((a+b)); 
     echo $c; 
     if ((a>b)); then b=$c; else a=$c; fi; 
  done

1
2
3
5
8
13
21
34
55


0 commentaires

0
votes

Vous avez besoin d'un espace

b=$((a+b))

et vous pouvez faire une évaluation arithmétique en utilisant

if [ "$a" -gt "$b" ]

une fois le script exécuté, vérifiez que le résultat est ce que vous attendez (c'est-à-dire qu'il affiche 0?)


0 commentaires

0
votes
#!/bin/bash
a=0  
b=1
echo $a
c=$1
for i in $(seq 1 $((c-1)));
do
    if [ $a -gt $b ]; then
        b=$((a+b))
        echo $b
    else
        a=$((a+b))
        echo $a
    fi
done

0 commentaires

0
votes

Utilisez des parenthèses doubles pour évaluer les expressions arithmétiques. Au lieu de:

for ((i = 0; i < $1; i++)); do
    if ((a > b)); then
        b=$((a + b))
        echo "$b"
    else
        a=$((a + b))
        echo "$a"
    fi
done

écrivez:

for ((i = 0; i < $1; i++))

et au lieu de:

$((a + b))

écrivez:

($a + $b)

Vous pouvez également écrire l'en-tête for de cette façon:

if ((a > b))

Mais ceci n'est pas obligatoire dans ce cas. Votre boucle devient alors:

if [ "$a" -gt "$b" ]


0 commentaires