Есть ли способ сделать что-то только в нерекурсивной функции? - PullRequest
0 голосов
/ 09 мая 2019

Если у меня есть такая функция:

def function(some number, steps):
  if steps == 1: return 1
  result = some calculation + function(some number, steps - 1)
  return round(result, 2)

, который возвращает некоторое число с плавающей точкой.
Мой вопрос: есть ли способ вернуть округленный результат, только когда я возвращаю результат из всей функции, но не из рекурсивного вызова (чтобы сохранить точность в расчете).
Я надеюсь, вы понимаете мой вопрос.
Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 09 мая 2019

Нет способа определить, вызывается ли ваша текущая функция как часть рекурсии или как ее первый шаг.Однако вы можете просто ввести новую функцию, которая будет вызывать существующую и выполнять любое дополнительное округление.

def internal_function(some number, steps):
    if steps == 1: return 1
    return some calculation + function(some number, steps - 1)

def function(some_number, steps):
    return round(internal_function(some_number, steps), 2)

Редактировать: в то время как истина в том, что подход с добавлением необязательного аргумента в функцию также может служитьу этого есть два недостатка:

  • загрязняет открытый интерфейс функции - ваши пользователи теперь задаются вопросом, должны ли они дать аргументу значение, и какое значение они должны дать точно
  • делаетвычислительная часть длиннее для чтения и может также потенциально уничтожить оптимизацию хвостового вызова .
2 голосов
/ 09 мая 2019

Да!Вы можете указать флаг, который будет срабатывать при последовательных вызовах:

def function(some number, steps, do_rounding=True):
    if steps == 1:
        return 1
    result = some calculation + function(some number, steps - 1, False)
    if do_rounding:
        return round(result, 2)
    else:
        return result
2 голосов
/ 09 мая 2019

Вообще говоря, если вы хотите обнаружить, что находитесь внутри рекурсивного вызова в Python, вы можете добавить параметр по умолчанию к функции, например, так:

def my_func(arg1, arg2, _inside_recursion=False):
   # Default calls will have _inside_recursion as False
   # Make sure that your recursive calls set the parameter
   recursive_result = my_func(arg1, arg2, _inside_recursion=True)
0 голосов
/ 09 мая 2019

Может быть, вы хотите что-то подобное?Это не эквивалентно коду OP, но имеет смысл.Он применяется some_calculation рекурсивно steps раз и округляет окончательное значение.

def function(x, steps):
  if steps == 1: return round(x, 2)
  return function(some_calculation(x), steps - 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...