2017-06-10 6 views
2

Supposons que je veuille résoudre l'équation x + 3 = 40 en utilisant GNU bc. Une façon de le faire serait de commencer par vérifier si 0 est une solution, puis de vérifier 1, et ainsi de suite, jusqu'à ce que j'arrive à la bonne réponse. (De toute évidence pas la meilleure façon de faire l'algèbre, mais oh bien.) J'entrez le code suivant dans bc GNU:Puis-je empêcher GNU bc de vomir des zéros?

int solver(int x); 
define solver(x){ 
if(x + 3 == 40) return x; 
x = x + 1; 
solver(x) 
} 
solver(0) 

Il produit 37 - la bonne réponse, bien sûr - mais le 37 est ensuite suivie 37 zéros. Sur la base de certaines expérimentations, il semble que chaque zéro provienne d'une instance de l'instruction if étant fausse, mais comment empêcher les zéros d'apparaître? J'utilise GNU bc pour résoudre des fonctions plus compliquées et créer des listes de nombres plus complexes, donc ce n'est vraiment pas pratique pour moi de trier tous les zéros. Toute aide serait appréciée, puisque je n'ai encore rien compris.

Répondre

1

Pour chaque opération qui n'est pas une affectation, bc imprime un état de sortie. Une façon de supprimer cela est d'affecter à la valeur factice . (qui est de toute façon la valeur du dernier résultat), une autre façon est de vous assurer que vous imprimez explicitement exactement ce dont vous avez besoin.

j'aurais écrit votre fonction comme ceci:

#!/usr/bin/bc -q 

define solver(x) { 
    if (x + 3 == 40) return x 
    return solver(x+1) 
} 
print solver(0), "\n" 

quit 

Quelques remarques pour votre tentative:

  • Je ne comprends pas ce que votre première ligne est censé faire, je Je l'ai laissé tomber
  • J'ai indenté le code, ajouté quelques espaces et enlevé les points-virgules – pour une question de goût et de lisibilité
  • J'ai simplifié l'appel récursif pour éviter le stand ligne solver(x) lui-même, car cela produit le faux 0

Quant à votre soupçon que la déclaration if produit les zéros: essayer, dans une session interactive, ce qui suit:

1 == 2      # Equality test on its own produces output 
0 
1 == 1      # ... for both true and false statements 
1 
if (1 == 2) print "yes\n" # No output from false if condition 
if (1 == 1) print "yes\n" # If statement is true, print string 
yes