Могу ли я предотвратить выбрасывание нулей GNU bc?

Предположим, я хочу решить уравнение x + 3 = 40, используя GNU bc. Один из способов сделать это — начать с проверки, является ли 0 решением, затем проверить 1 и так далее, пока я не получу правильный ответ. (Очевидно, что это не лучший способ заниматься алгеброй, но да ладно.) Итак, я ввожу в GNU bc следующий код:

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

Он дает 37 — правильный ответ, конечно, — но за 37 следует 37 нулей. Основываясь на некоторых экспериментах, кажется, что каждый ноль исходит из экземпляра оператора if, который является ложным, но как мне предотвратить появление нулей? Я использую GNU bc для решения более сложных функций и создания более сложных списков чисел, поэтому мне действительно нецелесообразно перебирать все нули. Любая помощь будет оценена по достоинству, так как я еще ничего не понял.


bc
person ILovePolitics    schedule 10.06.2017    source источник


Ответы (1)


Для каждой операции, не являющейся присваиванием, bc выводит статус выхода. Один из способов подавить это - присвоить фиктивное значение . (которое в любом случае является значением последнего результата), другой способ - убедиться, что вы явно печатаете именно то, что вам нужно.

Я бы написал вашу функцию так:

#!/usr/bin/bc -q

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

quit

Несколько замечаний к вашей попытке:

  • Я не понимаю, что должна делать ваша первая строка, я просто пропустил ее.
  • Я сделал отступ в коде, добавил пробелы и удалил точки с запятой в основном на вкус и удобочитаемость.
  • Я упростил рекурсивный вызов, чтобы строка solver(x) не стояла сама по себе, так как это создает ложные 0

Что касается вашего подозрения, что оператор if выдает нули: попробуйте в интерактивном сеансе следующее:

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
person Benjamin W.    schedule 10.06.2017